Android图像处理之像素点处理效果--(5)

上边两篇博文描述了利用ColorMatrix来处理图片,这篇文章讲如何改变图片的像素点的ARGB值,从而改变图片呈现效果。值得注意的是,我们是不能直接改变传递的原始图片的,一般是根据原始图片生成一张新的图片用来修改。
在Android中,系统提供了Bitmap.getPixels()方法来提取整个Bitmap中的像素点,并保存到第一个数组中,方法如下:
public void getPixels(@ColorInt int[] pixels, int offset, int stride,int x, int y, int width, int height)
//pixels---接收位图颜色值的数组
//offset---写入到pixels[]中的第一个像素索引值(即第一个像素要放在数组的那个位置)
//stride---pixels[]中的行间距
//x---从位图中读取的第一个像素的x坐标值
//y---从位图中读取的第一个像素的y坐标值(x,y确定从哪个像素点开始)
//width---从每一行中读取的像素宽度
//height---读取的行数

通常情况下,可以使用如下代码:
从第(0,0)个位置开始,一次获取原图所有点的像素值,一次放入数组oldArr中,第一个像素点的索引为0;

mBmp.getPixels(oldArr, 0, width, 0, 0, width, height);

接下来就是利用代码获取每个像素具体的ARGB值,代码如下:

for (int i = 0; i < oldArr.length; i++) {
    index = oldArr[i];
    oldA = Color.alpha(index);//A:透明度
    oldR = Color.red(index);//R:红
    oldG = Color.green(index);//G:绿
    oldB = Color.blue(index);//B:蓝
}

获取到具体的颜色值后,就可以通过相应的算法修改它的ARGB值,从而得到一个新的像素,从而重构一张新的图像。例如下代码,将修改过的ARGB值合成一个新的像素:

newA = oldA;
newR = (int) (0.393 * oldR + 0.769 * oldG + 0.189 * oldB);
newG = (int) (0.349 * oldR + 0.686 * oldG + 0.168 * oldB);
newB = (int) (0.272 * oldR + 0.534 * oldG + 0.131 * oldB);
curArr[i] = Color.argb(newA, newR, newG, newB);//重构一个新像素

最后通过如下代码,将处理后的像素点数组重新set给Bitmap

curPic.setPixels(curArr, 0, width, 0, 0, width, height);
  • 常用像素点处理效果
    这些处理方法是某些专业人士发现的,当然我也没查过到底是谁哈。通过特定的算法对每个像素点进行处理,就可以得到不同的处理效果。

  • 底片效果

newR = 255 - oldR;
newG = 255 - oldG;
newB = 255 - oldB;

实现代码:

/**底片效果*/
private Bitmap getNegativePic() {
    int oldA, oldR, oldG, oldB, newA, newR, newG, newB;
    Bitmap curPic = Bitmap.createBitmap(width, height, Config.ARGB_8888);
    mBmp.getPixels(oldArr, 0, width, 0, 0, width, height);//获取原图的像素值,将像素值放入oldArr中

    for (int i = 0; i < oldArr.length; i++) {
        index = oldArr[i];
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值