Android学习笔记进阶18之画图并保存图片到本地
1、首先创建一个Bitmap图片,并指定大小;
2、在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可;
3、需要保存的目录File,注意如果写的目录如“/sdcard/song/”如果不存在的话,要先创建(file.mkdirs).。
4、需要添加权限:<uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Canvas是一个画布,你可以建立一个空白的画布,就直接new一个Canvas对象,不需要参数。也可以先使用BitmapFactory创建一个Bitmap对象,作为新的Canvas对象的参数,也就是说这个画布不是空白的,如果你想保存图片的话,最好是Bitmap是一个新的,而不是从某个文件中读入进来的,或者是Drawable对象。然后使用Canvas画第一张图上去,在画第二张图上去,最后使用Canvas.save(int
flag)的方法进行保存,注意save方法里面的参数可以保存单个图层,如果是保存全部图层的
话使用 save( Canvas.ALL_SAVE_FLAG )。
关于图片旋转问题不懂的话,请看博文:Android学习笔记之Bitmap位图的旋转
这是原图片和旋转后图片


这是保存到本地的图片800*600 JPG格式
具体实现:
- package xiaosi.bitmap;
- import android.app.Activity;
- import android.os.Bundle;
- public class mianActivity extends Activity
- {
- private BitmapView bitmapView = null;
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- bitmapView = new BitmapView(this);
- setContentView(bitmapView);
- }
- }
BitmapView.Java
- package xiaosi.bitmap;
- import java.io.File;
- import java.io.FileOutputStream;
- import android.content.Context;
- import android.content.res.Resources;
- import android.graphics.Bitmap;
- import android.graphics.Bitmap.Config;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Matrix;
- import android.view.View;
- public class BitmapView extends View
- {
- private Matrix matrix = null;
- public BitmapView(Context context)
- {
- super(context);
- }
- public void onDraw(Canvas canvas)
- {
- // 获取资源文件的引用res
- Resources res = getResources();
- // 获取图形资源文件
- Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.h);
- // 设置canvas画布背景为白色
- canvas.drawColor(Color.BLACK);
- canvas.drawBitmap(bmp, 0, 0, null);
- // 定义矩阵对象
- matrix = new Matrix();
- //旋转30度
- matrix.postRotate(30);
- Bitmap bitmap = Bitmap.createBitmap(bmp, 0, 50, bmp.getWidth(), bmp.getHeight()/2,
- matrix, true);
- canvas.drawBitmap(bitmap, 0, 250, null);
- SaveBitmap(bitmap);
- }
- //保存到本地
- public void SaveBitmap(Bitmap bmp)
- {
- Bitmap bitmap = Bitmap.createBitmap(800, 600, Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- //加载背景图片
- Bitmap bmps = BitmapFactory.decodeResource(getResources(), R.drawable.playerbackground);
- canvas.drawBitmap(bmps, 0, 0, null);
- //加载要保存的画面
- canvas.drawBitmap(bmp, 10, 100, null);
- //保存全部图层
- canvas.save(Canvas.ALL_SAVE_FLAG);
- canvas.restore();
- //存储路径
- File file = new File("/sdcard/song/");
- if(!file.exists())
- file.mkdirs();
- try {
- FileOutputStream fileOutputStream = new FileOutputStream(file.getPath() + "/xuanzhuan.jpg");
- bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
- fileOutputStream.close();
- System.out.println("saveBmp is here");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
源代码下载:点击打开链接
Android学习笔记进阶18之画图并保存图片到本地的更多相关文章
- Android学习笔记进阶18 之画图并保存图片到本地
1.首先创建一个Bitmap图片,并指定大小: 2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可: 3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...
- Android学习笔记进阶之在图片上涂鸦(能清屏)
Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...
- Android学习笔记进阶17之LinearGradient
具体的看一下博文:Android学习笔记进阶15之Shader渲染 package xiaosi.BitmapShader; import android.app.Activity; import a ...
- Android学习笔记进阶16之BitmapShader
<1>简介 具体的看一下博文:Android学习笔记进阶15之Shader渲染 public BitmapShader(Bitmap bitmap,Shader.TileMode ti ...
- Android 学习笔记进阶十二之裁截图片
package xiaosi.cut; import java.io.File; import android.app.Activity; import android.content.Intent; ...
- Android 学习笔记进阶14之像素操作
在我们玩的游戏中我们会经常见到一些图像的特效,比如半透明等效果.要实现这种半透明效果其实并不难,需要我们懂得图像像素的操作. 不要怕,其实在Android中Bitmap为我们提供了操作像素的基本方法. ...
- Android学习笔记进阶19 之给图片加边框
//设置颜色 public void setColour(int color){ co = color; } //设置边框宽度 public void setBorderWidth(int width ...
- Android学习笔记进阶20 之得到图片的缩略图
<1>简介 之前往往是通过Bitmap.Drawable和Canvas配合完成,需要写一系列繁杂的逻辑去缩小原有图片,从而得到缩略图. 现在我给大家介绍一种比较简单的方法:(网上有) 在A ...
- Android学习笔记进阶21之设置壁纸
别忘记在ApplicationManifest.xml 中加上权限的设置. <uses-permission Android:name = "android.permission.SE ...
随机推荐
- socket 编程的端口和地址复用
在linux socket网络编程中,大规模并发TCP或UDP连接时,经常会用到端口复用: int opt = 1; if(setsockopt(sockfd, SOL_SOCKET,SO_R ...
- 【SRM 716 DIV 1 A】 ConstructLCS
Problem Statement A string S is a subsequence of a string T if we can obtain S from T by erasing som ...
- vmware下ubuntu的网络配置
捣弄了vmnet0和vmnet8连接后,ubuntu上不了网了,今天突然解决了这个问题. 打开vmware后,点编辑-->虚拟网络编辑器 这里我使用的是NAT模式,所以要修改vmnet8 点vm ...
- javascript小白学习指南1---0
第二章 变量和作用域 在看第二章时我希望,你能够回想一下前一次所讲的内容 假设有所遗忘 点这里 今天我们来说说 变量和作用域的问题 本章主要内容 基本类型和引用类型 运行环境 垃圾回收( ...
- [BZOJ4826][HNOI2017]影魔 可持久化线段树
链接 题意:给你 \(1\) 到 \(n\) 的排列 \(k_1,k_2,\dots,k_n\) ,对 \(i,j (i<j)\)来说,若不存在 \(k_s (i<s<j)\) 大于 ...
- MVP模式入门(结合Rxjava,Retrofit)
本文MVP的sample实现效果: github地址:https://github.com/xurui1995/MvpSample 老规矩,在说对MVP模式的理解之前还是要再谈谈MVC模式,了解了MV ...
- spring-cloud-netflix集成的服务
1.Ribbon Ribbon is a client side IPC library that is battle-tested in cloud. It provides the followi ...
- Scrapy请求传参
scrapy.Request(url=url, callback=self.parse_item, meta={'item': item}, headers=headers) url: 要请求的地址 ...
- route---设置Linux内核中的网络路由表
route命令用来显示并设置Linux内核中的网络路由表,route命令设置的路由主要是静态路由.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现. 在L ...
- JS数组去重的6种算法实现
1.遍历数组法 最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法"indexOf"是ECMAScript5 方法 ...