Android图像处理之镜像和简单滤镜效果

项目地址:https://github.com/Rbtoooooooooo/camera_take_demo

所有滤镜算法的前几步都是先得到一张图片的所有像素点,存储在一个 int一维数组 中,然后通过循环,遍历每一个像素点,轮到该像素点时,先得到它的r,g,b,a四个值,然后对rgb进行处理,得到新的r1,g1,b1,再和原来的a值生成新的像素点,循环完成后就会的到新的像素点数组,最后通过新的数组生成图片即可。

原图

原图

黑白滤镜

效果

黑白

原理

得到该像素点的r值,g值,b值。将rgb值加起来去平均值avg,如果0<avg<85则rgb的值都设置为0,如果85<=avg<170则设置rgb的为127,其他情况rgb的值设置为255,然后在根据新的rgb值设置新的像素值。

算法

我的除了黑白两个颜色外,其实还有灰色。

int avg;
for (int i = 0; i < width * height; i++) {
    color = oldPx[i];
    a = Color.alpha(color);
    r = Color.red(color);
    g = Color.green(color);
    b = Color.blue(color);

    avg = (int)(r + g + b) / 3;
    if (avg >= 0 && avg < 85) {           // 黑色
        r = 0;
        g = 0;
        b = 0;
    } else if (avg >= 85 && avg < 170) {  // 灰色
        r = 127;
        g = 127;
        b = 127;
    } else {                              // 白色
        r = 255;
        g = 255;
        b = 255;
    }

     newPx[i] = Color.argb(a, r, g, b);
}
bmp.setPixels(newPx, 0, width, 0, 0, width, height);

怀旧滤镜

效果

怀旧

原理

得到该像素点的rgb值后,根据前人总结的经验,即特定的公式,就可以得到新的rgb值,然后在生成新的像素点

算法
for (int i = 0; i < width * height; i++) {
    color = oldPx[i];
    a = Color.alpha(color);
    r = Color.red(color);
    g = Color.green(color);
    b = Color.blue(color);

    r1 = (int) (0.393 * r + 0.769 * g + 0.189 * b);
    g1 = (int) (0.349 * r + 0.686 * g + 0.168 * b);
    b1 = (int) (0.272 * r + 0.534 * g + 0.131 * b);

    if (r1 > 255) {
        r1 = 255;
    }
    if (g1 > 255) {
        g1 = 255;
    }
    if (b1 > 255) {
        b1 = 255;
    }

    newPx[i] = Color.argb(a, r1, g1, b1);
}
bmp.setPixels(newPx, 0, width, 0, 0, width, height);

底片滤镜

效果

底片
得到rgb值后,新的rgb等于用255减去原来的rgb

算法
for (int i = 0; i < width * height; i++) {
    color = oldPx[i];
    r = Color.red(color);
    g = Color.green(color);
    b = Color.blue(color);
    a = Color.alpha(color);

    r = 255 - r;
    g = 255 - g;
    b = 255 - b;

    if (r > 255) {
        r = 255;
    } else if (r < 0) {
        r = 0;
    }
    if (g > 255) {
        g = 255;
    } else if (g < 0) {
        g = 0;
    }
    if (b > 255) {
        b = 255;
    } else if (b < 0) {
        b = 0;
    }
    newPx[i] = Color.argb(a, r, g, b);
}
bmp.setPixels(newPx, 0, width, 0, 0, width, height);

浮雕滤镜

效果

这里写图片描述

原理

取i-1处的像素点,i处的新像素点的rgb由i处的旧像素点的rgb减去i-1处的像素点的rgb再加上127。若加上127后大于255,则令其等于255

算法
for (int i = 1; i < width * height; i++) {
    colorBefore = oldPx[i - 1];
    a = Color.alpha(colorBefore);
    r = Color.red(colorBefore);
    g = Color.green(colorBefore);
    b = Color.blue(colorBefore);

    color = oldPx[i];
    r1 = Color.red(color);
    g1 = Color.green(color);
    b1 = Color.blue(color);

    r = (r - r1 + 127);
    g = (g - g1 + 127);
    b = (b - b1 + 127);
    if (r > 255) {
        r = 255;
    }
    if (g > 255) {
        g = 255;
    }
    if (b > 255) {
        b = 255;
    }
    newPx[i] = Color.argb(a, r, g, b);
}
bmp.setPixels(newPx, 0, width, 0, 0, width, height);

镜像

效果

这里写图片描述

原理

令新图左边的像素点等于原图右边的像素点,新图右边的像素点等于左边的像素点。

算法
for (int i = 0; i < pHeight; i++) {
    for (int j = 0; j < pWidth; j++) {
        newPexils[i*pWidth+j] = oldPexils[i*pWidth + pWidth - j - 1];
    }
}
bitmap.setPixels(newPexils, 0, pWidth, 0, 0, pWidth, pHeight);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值