1.2.1 转换位图的像素色彩

给图片添加装饰物,只是在局部变花样,无法改动图片自身。若想让图片一边保持轮廓一边改变色彩,譬如把一张彩色照片变为黑白照片,仿佛加了一层滤镜那般,此时就得深入图像的每个像素点,将这些像素点统统采取某种算法修改一番。在像素级别更改图像的话,要先把图片转成位图对象再进一步加工位图对象。这种滤镜特效的加工处理用到了位图工具Bitmap,它有主要的三个操作方法,现说明如下:

  • createBitmap:创建一个新位图。
  • getPixels:获取位图对象所有点的像素数组。
  • setPixels:设置位图对象所有点的像素数组。

更详细的位图加工步骤说明如下:

调用createBitmap方法创建新的空白位图。

调用原位图的getPixels方法,把该位图所有像素的色值保存到指定的像素点数组。

遍历第二步得到的像素点数组,分别获取每个点的灰度、红色、绿色以及蓝色的色值,并按照特定算法调整该点的色值。

像素点数组全部调整完毕之后,调用新位图的setPixels方法更新所有像素的色值。

上面四个步骤都做完之后得到的便是经过特效处理的新位图了。

以常见的几种特效处理为例,它们的加工算法描述如下:

(1)黑白效果:黑白照片对于彩色照片来说,就好比黑白电视机之于彩色电视机,黑白照片只有灰度的深浅区别,而没有红绿蓝之分。

(2)怀旧效果:现实生活中的老照片都是泛黄的,而黄色又是由绿色和红色混合而成的,所以怀旧效果为了突出黄色,就得加大绿色和红色的比重,同时降低蓝色的比重。

(3)底片效果:在数码相机时代之前,占统治地位的是胶卷相机,胶卷底片与洗出来的照片相比,底片的RGB值就是照片的RGB值取反,即:底片的红色=255-照片的红色,底片的绿色=255-照片的绿色,底片的蓝色=255-照片的蓝色。

(4)模糊效果:要让图片变得模糊起来,每个点的颜色都由附近一片像素颜色混合而成,这样图片中每个景物的边缘就变模糊了。

下面的代码描述的是两种图片特效的算法,两种特效为黑白效果和怀旧效果:

(完整代码见picture\src\main\java\com\example\picture\util\BitmapUtil.java)

经过特效加工之后的新位图呈现出与原图片截然不同的风貌,具体的画面对比如图1-9~图1-13所示。

图1-9 原始图片的画面

图1-10 黑白效果的画面

图1-11 怀旧效果的画面

图1-12 底片效果的画面

图1-13 模糊效果的画面