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);
                }
            }
        });
    }
}
Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理的更多相关文章
- Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理
		
前言 java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API ...
 - CGAffineTransform  缩放 / 旋转 / 平移
		
CGAffineTransform此类是一个3*3矩阵的变换. - (void)transformImageView { CGAffineTransform t = CGAffineTransform ...
 - Android利用canvas画画板
		
首先新建一个项目工程,建立文件,如下图所示
 - Android小应用-----画画板
		
public class MainActivity extends Activity { private ImageView iv; float startX = 0; float startY = ...
 - Android 实现图片画画板
		
本文主要讲述了Android 实现图片画画板 设计项目布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk ...
 - android96  内存创建图片副本,画画板
		
package com.itheima.copy; import android.os.Bundle; import android.app.Activity; import android.grap ...
 - Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等(转)
		
惯例先看效果图 // 注意做类似这种模板功能时候 方位由后台数据提供,这里我们用假数据 4个点 或者xy 加区域来做示例 //一开始我们公司用的是透明盖住 操作图片 但发现 局限性较大.后来直接限定区 ...
 - 利用canvas制作图片(可缩放和平移)+相框+文字
		
前言: 公司一个售前问我能不能用H5做一个手机拍照,给相片添加相框和添加文字上传到服务器的功能,我当时一琢磨觉得可行,就利用空余时间做了一个demo,去掉了拍照和上传,如果以后有机会,会给补上,当然对 ...
 - Android开发ImageView控件缩放图片
		
首先还是最基础的ImageView控件如何显示图片: <ImageView Android:id="@+id/imgView" ...
 
随机推荐
- sort排序和uniq统计命令
			
author:headsen chen date: 2018-08-13 11:08:09 1,sort:排序的功能,默认安装ASCII码来排序,-n 安装数值排,-r 按照倒序来排 [root@b ...
 - centos7上开启单用户模式
			
author: headsen chen date : 2018-08-02 11:23:16 1,在出现centos7的页面的时候,按 e进入到编译内核的界面 2,找到下面的这一段,将ro 该车 ...
 - angularJS中的MVC思想?
			
mvc 思想: 将应用程序的组成,划分为三个部分:model , controller 和 view ; - 控制器的作用是用来初始化模型用的: - 模型就是用于存储数据的: - 视图是展示数据的: ...
 - MUI窗口管理
			
参考:窗口管理 http://dev.dcloud.net.cn/mui/window/ 页面初始化:在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用,m ...
 - 手机联系人信息获取(contacts) ---- HTML5+
			
模块:contacts Contacts模块管理系统通讯录,用于可对系统通讯录进行增.删.改.查等操作.通过plus.contacts获取系统通讯录管理对象. 对象:联系人对象(属性:电话,地址等)针 ...
 - OneThink视图模型进行组合查询!文档组合文档详情
			
测试方法:twoCate: public function twoCate(){ $where = array( 'category_id'=>43 ); $list = D('TwoView' ...
 - 以jar包的形式来使用前端的各种框架、组件。
			
springboot(二):web综合开发 - 纯洁的微笑博客 http://www.ityouknow.com/springboot/2016/02/03/spring-boot-web.html ...
 - talib 中文文档(九):Volume Indicators 成交量指标
			
Volume Indicators 成交量指标 AD - Chaikin A/D Line 量价指标 函数名:AD 名称:Chaikin A/D Line 累积/派发线(Accumulation/Di ...
 - 小米范工具系列之二:小米范 web目录扫描器
			
最新版本1.1,下载地址:http://pan.baidu.com/s/1c1NDSVe 文件名scandir,请使用java1.8运行 小米范web目录扫描器主要功能是探测web可能存在的目录及文 ...
 - 【PHP】善用php-fpm的慢执行日志slow log,分析php性能问题
			
(转)善用php-fpm的慢执行日志slow log,分析php性能问题 众所周知,mysql有slow query log,根据慢查询日志,我们可以知道那些sql语句有性能问题.作为mysql的好 ...