Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理
1. 画画板 示例代码
public class MainActivity extends Activity { private ImageView iv; private Bitmap baseBitmap; private Canvas canvas; private Paint paint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); paint = new Paint(); paint.setStrokeWidth(5); paint.setColor(Color.GREEN); // 创建一个可以被修改的bitmap baseBitmap = Bitmap.createBitmap(320, 359, Bitmap.Config.ARGB_8888); System.out.println("图宽度:"+iv.getWidth()); System.out.println("图宽高:"+iv.getHeight()); canvas = new Canvas(baseBitmap); canvas.drawColor(Color.WHITE); // 知道用户手指在屏幕上移动的轨迹 iv.setOnTouchListener(new OnTouchListener() { //定义手指开始位置的坐标 int startX; int startY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 手指第一次接触屏幕 System.out.println("手指按下"); startX = (int) event.getX(); startY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: // 手指在屏幕上滑动 System.out.println("手指移动"); int newX = (int) event.getX(); int newY = (int) event.getY(); canvas.drawLine(startX,startY, newX, newY, paint); //重新更新画笔的开始位置. startX = (int) event.getX(); startY = (int) event.getY(); iv.setImageBitmap(baseBitmap); break; case MotionEvent.ACTION_UP:// 手指离开屏幕 break; } return true; } }); } public void save(View view) { try { File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg"); FileOutputStream stream = new FileOutputStream(file); baseBitmap.compress(CompressFormat.JPEG, 100, stream); stream.close(); Toast.makeText(this, "保存图片成功", 1).show(); //模拟一个消息 通知系统sd卡被重新挂载了. Intent intent = new Intent(); intent.setAction(Intent.ACTION_MEDIA_MOUNTED); intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory())); sendBroadcast(intent); } catch (Exception e) { Toast.makeText(this, "保存图片失败", 1).show(); e.printStackTrace(); } } }
2. 图片缩放
public class MainActivity extends Activity { private ImageView iv_src; private ImageView iv_dest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv_src = (ImageView) findViewById(R.id.iv_src); iv_src.setImageBitmap(BitmapFactory.decodeFile("/sdcard/tom.png")); iv_dest = (ImageView) findViewById(R.id.iv_dest); } public void click(View view) { Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/tom.png"); Bitmap baseBitmap = Bitmap.createBitmap(bitmap.getWidth()*2, bitmap.getHeight()/2, bitmap.getConfig()); Canvas canvas = new Canvas(baseBitmap); Matrix matrix = new Matrix(); /* matrix.setValues(new float[] { 2, 0, 0, 0, 0.5f, 0, 0, 0, 1 });*/ matrix.setScale(2.0f, 0.5f); canvas.drawBitmap(bitmap, matrix, new Paint()); iv_dest.setImageBitmap(baseBitmap); } }
3. 图片旋转
Matrix matrix = new Matrix(); matrix.setRotate(15); canvas.drawBitmap(bmp, matrix, paint); 消除锯齿 paint.setAntiAlias(true); 指定圆心的旋转 matrix.setRotate(15,bmp.getWidth()/2,bmp.getHeight()/2);
4. 图片平移
matrix.setTranslate(1.5f,-10);
5. 镜面效果
matrix.setScale(-1, 1);
matrix.postTranslate(bmp.getWidth(),0);
6. 倒影
matrix.setScale(1, -1);
matrix.postTranslate(0, bmp.getHeight());
7. 图片合成
public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); //第一张图 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a1); //第二张图 Bitmap addbitMap = BitmapFactory.decodeResource(getResources(), R.drawable.a3); //可修改的位图 及 画板 Bitmap alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); Canvas canvas = new Canvas(alterBitmap); Paint point = new Paint(); point.setColor(Color.BLACK); point.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_OVER));//合成模式 //将第一张图和第二张图画到画板的可修改位图上 canvas.drawBitmap(bitmap, new Matrix(), point); canvas.drawBitmap(addbitMap, new Matrix(), point); iv.setImageBitmap(alterBitmap); } }
8. 颜色处理,RGB颜色, 亮度, 饱和度
亮度处理
ColorMatrix cm = new ColorMatrix(); float contrast = 2; cm.set(new float[] { contrast, 0, 0, 0, 0, 0, contrast, 0, 0, 0, 0, 0, contrast, 0, 0, 0, 0, 0, 1, 0 }); paint.setColorFilter(new ColorMatrixColorFilter(cm));
RGB 及 饱和度
public class MainActivity extends Activity { private ImageView iv1; private SeekBar sb1; private SeekBar sb2; private SeekBar sb3; private SeekBar sb4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main2); iv1 = (ImageView) findViewById(R.id.iv_1); sb1 = (SeekBar) findViewById(R.id.seekBar1); sb2 = (SeekBar) findViewById(R.id.seekBar2); sb3 = (SeekBar) findViewById(R.id.seekBar3); sb4 = (SeekBar) findViewById(R.id.seekBar4); sb1.setMax(255); sb2.setMax(255); sb3.setMax(255); sb4.setMax(255); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.top); final Bitmap baseBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); final Canvas canvas = new Canvas(baseBitmap); final Matrix matrix = new Matrix(); final Paint paint = new Paint(); canvas.drawBitmap(bitmap, matrix, paint); iv1.setImageBitmap(baseBitmap); //调节R 红色 sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int ret = seekBar.getProgress(); if(ret!=0) { ColorMatrix cm = new ColorMatrix(); cm.set(new float[]{ ret/128.0f,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,1,0, }); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(baseBitmap, matrix, paint); iv1.setImageBitmap(baseBitmap); } } }); //调节G 绿色 sb2.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int ret = seekBar.getProgress(); if(ret!=0) { ColorMatrix cm = new ColorMatrix(); cm.set(new float[]{ 1,0,0,0,0, 0,ret/128.0f,0,0,0, 0,0,1,0,0, 0,0,0,1,0, }); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(baseBitmap, matrix, paint); iv1.setImageBitmap(baseBitmap); } } }); //调节B 蓝色 sb3.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int ret = seekBar.getProgress(); if(ret!=0) { ColorMatrix cm = new ColorMatrix(); cm.set(new float[]{ 1,0,0,0,0, 0,1,0,0,0, 0,0,ret/128.0f,0,0, 0,0,0,1,0, }); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(baseBitmap, matrix, paint); iv1.setImageBitmap(baseBitmap); } } }); //调节 饱和度 sb4.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int ret = seekBar.getProgress(); if(ret!=0) { ColorMatrix cm = new ColorMatrix(); cm.setSaturation(ret/128.0f); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(baseBitmap, matrix, paint); iv1.setImageBitmap(baseBitmap); } } }); } }