Android开发笔记之图片的颜色处理

这次我们来讨论例如美图秀秀中对一张图片改变图片风格的操作。很多女孩子自拍后往往会对照片进行美化。我们来说说这个问题。
1.首先我们应该了解的一个知识点:
图像的颜色处理主要借助颜色矩阵(ColorMatrix)这个类。颜色矩阵是一个5*4的矩阵,在Android中,颜色矩阵是以一位数组存储的。
这里写图片描述
通过颜色矩阵修改原图像的RGBA值。第一行的1代表红色像素富集程度,第二行的2表示绿色的像素富集程度,第三行的1表示蓝色富集程度,第四行的1表示透明程度。
所以我们要改变图片的颜色我们可以通过修改像素矩阵来做到。但是,我们无法对加载的原图进行操作,所以我们应该重新拷贝一张和原图一模一样的图来进行。
2.我们做一个通过调节seekbar来改变图片颜色的例子。
我们来分析一下如何实现:
a.布局三个seekbar
b.准备好原图片
c.画图准备:Bitmap,Canvas,Paint
d.重新计算像素矩阵,利用setColorFilter重新设置像素
e.画修改过像素矩阵的图片
布局文件三个seekbar,分别调节由..变红,由..变蓝,由..变绿。
其中包括seekbar调节

public class MainActivity extends Activity implements OnSeekBarChangeListener{

    SeekBar red,green,blue;
    ImageView iv;
    private Bitmap basebitmap,copybitmap;
    private Canvas canvas;
    private Paint paint;
    private float red_vector,green_vector,blue_vector;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        red=(SeekBar) findViewById(R.id.red);
        green=(SeekBar) findViewById(R.id.green);
        blue=(SeekBar) findViewById(R.id.blue);
        iv=(ImageView) findViewById(R.id.iv);

        red.setOnSeekBarChangeListener(this);
        green.setOnSeekBarChangeListener(this);
        blue.setOnSeekBarChangeListener(this);

    }

    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        basebitmap=BitmapFactory.decodeResource(getResources(), R.drawable.img_small_1);
        copybitmap=Bitmap.createBitmap(basebitmap.getWidth(),basebitmap.getHeight(),basebitmap.getConfig());
        canvas=new Canvas(copybitmap);
        Matrix matrix=new Matrix(); 
        paint=new Paint();
        float[] colors=new float[]{red_vector,0,0,0,0,
                                   0,green_vector,0,0,0,
                                   0,0,blue_vector,0,0,
                                   0,0,0,1,0};
        paint.setColorFilter(new ColorMatrixColorFilter(colors));
        canvas.drawBitmap(basebitmap, matrix, paint);
        iv.setImageBitmap(copybitmap);

    }

    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        int progress=seekBar.getProgress();
        float count=progress/50f;//使得拖动条取值为0f-2f

        switch (seekBar.getId()) {
        case R.id.red:
            this.red_vector=count;
            break;
        case R.id.green:
            this.green_vector=count;
            break;
        case R.id.blue:
            this.blue_vector=count;
            break;
        }
    }
}

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值