上边两篇博文描述了利用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];