Android图片特效处理(像素处理)

这篇博客介绍如何通过直接操作像素的RGB分量实现Android图片的各种特效,包括灰度化、亮度/饱和度/对比度调整、水印文字、怀旧效果等。虽然代码效率可能不高,但强调了实现思路。文中提供了关键代码片段,并推荐了一个ImageFilter库。
摘要由CSDN通过智能技术生成

这篇博客将会通过对像素的RGB分量做一个处理,然后达到一些特效。并没有很高端大气的代码。也没用使用ImageFilter等一些库。多数参考了别人,大神勿喷。
首先看一下今天的效果图。
这里写图片描述
由于上传大小限制的关系,只有一小部分。当然,功能中除了光晕,其他都是实现了的。如果可以的话,我回上传到github上gif图。代码请在文末下载。那么接下来,我们就来看下如何实现这些。
再次声明,绝大多数是操作像素实现的。速度上可能会很慢。不过不要紧,要的是思想。

由于代码太多的原因,下面只会给出关键性代码,更多代码请前往github。

  • 图片灰度化
    灰度化原理:当前像素值=0.3r+0.59g+0.11b
    灰度化我在这里用2中方法实现的。一种是操作ColorMatrix,另一种是颜色分量处理。代码如下
public Bitmap doPro(Bitmap src) {
        int width,height;
        height = src.getHeight();
        width = src.getWidth();
        Bitmap bitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        ColorMatrix colorMatrix = new ColorMatrix();
        colorMatrix.setSaturation(0);
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
        paint.setColorFilter(filter);
        canvas.drawBitmap(src, 0, 0, paint);
        return bitmap;
    }

关于ColorMatrix,参考官方文档。

@Override
    public Bitmap doProByPix(Bitmap src) {
        int width = src.getWidth();
        int height = src.getHeight();
        //创建像素点数组
        int[] pixels = new int[width*height];
        int alpha,grey,red,green,blue;
        src.getPixels(pixels,0,width,0,0,width,height);
        alpha = 0xFF<<24;
        for (int i = 0 ; i < height ; i++){
            for (int j = 0 ; j < width ; j++){
                grey  = pixels[width*i+j];
                red = ((grey & 0x00FF0000)>>16);
                green = ((grey & 0x0000FF00)>>8);
                blue = ((grey & 0x000000FF));

                grey = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11);
                grey = alpha | (grey<<16)|(grey<<8)|grey;

                pixels[width*i+j]=grey;
            }
        }
        Bitmap pro = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);
        pro.setPixels(pixels,0,width,0,0,width,height);

        return pro;
    }

上面这个通过对颜色的 与,左移,右移来拿到颜色分量,当然,也有更简单的方法拿到分离,后面会说。

  • 对亮度/饱和度/对比度的操作
    这里的操作就会用到颜色矩阵,颜色矩阵,我并不会多说。如果感兴趣就取查看官方文档。这并不是重点
public Bitmap doPro(Bitmap src) {
        int width = src.getWidth();
        int height = src.getHeight();
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        ColorMatrix colorMatrix = new ColorMatrix();
        //设置饱和度 设置为0.7  范围 0 - 1
        //colorMatrix.setSaturation((float) 0.7);
        //设置亮度
        colorMatrix.set(new float[]{
  1,0,0,0,70,
                                    0,1,0,0,70,
                                    0,0,1,0,70,
                                    0,0,0,
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值