简单操作图片
2018-08-11 本文已影响0人
dev晴天
// 安卓是不允许在原图片上进行操作的 例如。
bitmap.setPixel(20,30, Color.RED);
/* 报错 Caused by: java.lang.IllegalStateException
at android.graphics.Bitmap.setPixel(Bitmap.java:1394)*/
创建副本 操作副本:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivSrc = (ImageView) findViewById(R.id.iv_src);
ivCopy = (ImageView) findViewById(R.id.iv_copy);
// 1 先把图片转化为bitmap 显示再ivSrc上(getResources() 获得当前工程的资源)
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.linyun2);
// 安卓是不允许在原图片上进行操作的 例如。
//bitmap.setPixel(20,30, Color.RED);
/* 报错 Caused by: java.lang.IllegalStateException
at android.graphics.Bitmap.setPixel(Bitmap.java:1394)*/
ivSrc.setImageBitmap(bitmap);
/*2 创建原图的副本 (宽 高 配置 都一样)
静态方法 的调用(此处创建的副本可以操作)
返回Bitmap 对象 (通过此类BitmapFactory也会有多种方法创建Bitmap)
相当于创建了和原图大小一样的白纸*/
Bitmap copyBitmap= Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight()
,bitmap.getConfig());
// 作画 需要画笔
Paint paint = new Paint();
//画布 白纸铺到画布上
Canvas canvas = new Canvas(copyBitmap);
// 开始作画 (有很多方法 画圆形 矩形 bitmap)
/* 参数 bitmap(参考的bitmap对象) 矩阵 (此处使用默认的矩阵) 画笔 */
canvas.drawBitmap(bitmap,new Matrix(),paint);
for (int i=0;i<200;i++){
copyBitmap.setPixel(i+20,30,Color.RED);
}
ivCopy.setImageBitmap(copyBitmap);
}
/* 步骤 小结: 首先创建副本(Bitmap的静态方法 产生的时和原图片大小相同的白纸)
* 声明画笔 画布
* 白纸铺到画布上
* 画布方法吊用 画和原位图一样的图
* 通过画笔操作
* 加载图片
*
* */
补充 只要是控件都有触摸事件
ivCopy.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action){
case MotionEvent.ACTION_DOWN
break;
}
return false;//返回true表示事件处理完毕
}
});
保存位图
/* 保存图片:
format 格式
int quality 0-100 图片质量
outputStream */
FileOutputStream fos= null;
// SystemClock.uptimeMillis() 当前手机开机时间 开机到现在运行了多长
// file 的两个参数 路径 文件名
File file = new File(getFilesDir().getAbsolutePath(), SystemClock.uptimeMillis()+"linyun2.JPEG");
try {
fos = new FileOutputStream(file);
copyBitmap.compress(Bitmap.CompressFormat.JPEG,100,fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}