在Android中直接加载的bitmap对象是只读的,无法修改,要修改图片只能在内存中创建出一个一模一样的bitmap副本,然后修改副本达到对图片的处理,副本以imageview作为容器装载。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这个对象是只读的
Bitmap bm = BitmapFactory.decodeFile("data/data/com.example.copy/cache/myself.png");
//创建图片副本
//1.在内存中创建一个与原图一模一样大小的bitmap对象,创建与原图大小一致的白纸
Bitmap bmCopy = Bitmap.createBitmap(bm.getWidth(),bm.getHeight(),bm.getConfig());
//2.创建画笔对象
Paint paint = new Paint();
//3.创建画板,将白纸铺在画板上
Canvas canvas = new Canvas(bmCopy);
//4.开始作画,把原图内容绘制在白纸上
canvas.drawBitmap(bm, new Matrix(), paint);
ImageView iv_src = (ImageView) findViewById(R.id.iv_src);
ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);
iv_src.setImageBitmap(bm);
iv_copy.setImageBitmap(bmCopy);
}
}
使用canvas实现一些图片的特效
本质:图片的特效都是对图片这个矩阵的操作使其发生改变
首先还是加载出图片,定义好画笔,画板,将白纸在画板上,然后对白纸进行操作,完成需要的特效然后将图片绘制在定义好的画板上
//这里的矩阵不要定义在drawbitmap中,因为需要对矩阵进行操作才能实现特效,所以直接定义出矩阵对象。
Matrix mt = new Matrix();
//平移
//mt.setTranslate(20, 40);
//缩放,sx是水平方向的缩放比例,sy是竖直方向的缩放比例
//mt.setScale(2, 0.5f);
//该缩放是后面两个参数是缩放点的位置
// mt.setScale(0.5f, 0.5f, bm.getWidth() / 2,bm.getHeight() / 2);
//旋转
//mt.setRotate(45);
//镜面
mt.setScale(-1, 1);
mt.postTranslate(bm.getWidth(), 0);
//倒影
mt.setScale(1, -1);
mt.postTranslate(0, bm.getHeight());
canvas.drawBitmap(bm, mt , paint);
//canvas.drawLine(10, 10, 40, 40, paint);
ImageView iv_src = (ImageView) findViewById(R.id.iv_src);
ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);
iv_src.setImageBitmap(bm);
iv_copy.setImageBitmap(bmCopy);
图画板实例,可以在白板上通过手指的触摸滑动作出自己想要的图形。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//加载画板的背景图
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
//创建背景图的副本
copy= Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
paint = new Paint();
canvas = new Canvas(copy);
canvas.drawBitmap(bm, new Matrix(), paint);
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(copy);
//设置触摸侦听
iv.setOnTouchListener(new OnTouchListener() {
//触摸事件产生时此方法调用
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
switch (action) {
//用戶手指摸到屏幕
case MotionEvent.ACTION_DOWN:
startx = (int) event.getX();
starty = (int) event.getY();
break;
//用戶手指正在滑动
case MotionEvent.ACTION_MOVE:
int x = (int) event.getX();
int y = (int) event.getY();
//System.out.println(x+" "+y);
canvas.drawLine(startx, starty, x, y, paint);
iv.setImageBitmap(copy);
startx = x;
starty = y;
break;
//用户手指离开屏幕
case MotionEvent.ACTION_UP:
break;
default:
break;
}
//返回true:告诉系统,触摸事件我来处理
//返回false:告诉系统,触摸事件我不处理,返回给imageview父节点处理
return true;
}
});
}
改变画笔颜色
paint.setColor(Color.RED);
改变画笔大小
//其中的数字就是画笔的大小
paint.setStrokeWidth(7);