Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

1. 画画板 示例代码

Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理
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();
        }
        
        
        
    }

}
Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

2. 图片缩放

Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理
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);
    }
}
Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

3. 图片旋转

Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理
Matrix matrix = new Matrix();

matrix.setRotate(15);

canvas.drawBitmap(bmp, matrix, paint);

消除锯齿

paint.setAntiAlias(true);  

指定圆心的旋转

matrix.setRotate(15,bmp.getWidth()/2,bmp.getHeight()/2);
Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

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. 图片合成

Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理
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);                
    }
}
Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

 8. 颜色处理,RGB颜色, 亮度, 饱和度

亮度处理

Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理
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));
Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

RGB 及 饱和度 

Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理
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);
                }
            }
        });
        
    }

}
Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

 

 

Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理,布布扣,bubuko.com

Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

上一篇:微信小程序:原生热布局终将改变世界


下一篇:探索Web Office Apps服务