Android图像锐化、饱和度、色调、亮度和对比度。

3
我正在尝试创建一个应用程序,通过调整每个字段的滑动条来调整图像的色相、饱和度、亮度、对比度和锐度,就像http://ronbigelow.com/articles/workflow_basic/hue-saturation_tool.jpg上的工具一样。我不知道该如何实现这一点,也找不到任何在线教程。Android是否已经有了这样的功能?我必须操纵单个像素的颜色吗?如果我必须处理像素,我该怎么做?
1个回答

4
是的,安卓有一些用于操作颜色的工具,有些更容易,有些则更难。在所有图像的一般空间中,实现您特定要求的唯一方法是修改单个像素。还有其他快速而粗略的技巧,速度更快,但精度较低(ColorFilter)。
色相变换器:
private Bitmap adjustedHue(Bitmap o, int deg)
{
   Bitmap srca = o;
   Bitmap bitmap = srca.copy(Bitmap.Config.ARGB_8888, true);
   for(int x = 0;x < bitmap.getWidth();x++)
       for(int y = 0;y < bitmap.getHeight();y++){
               int newPixel = hueChange(bitmap.getPixel(x,y),deg);
               bitmap.setPixel(x, y, newPixel);
       }

   return bitmap;
}
private int hueChange(int startpixel,int deg){
   float[] hsv = new float[3];       //array to store HSV values
   Color.colorToHSV(startpixel,hsv); //get original HSV values of pixel
   hsv[0]=hsv[0]+deg;                //add the shift to the HUE of HSV array
   hsv[0]=hsv[0]%360;                //confines hue to values:[0,360]
   return Color.HSVToColor(Color.alpha(startpixel),hsv);
}

从这里开始,饱和度/亮度很简单。但是,虽然所有这些都会得到你想要的结果,但速度有点慢。getPixel()函数特别耗费资源。如果您要实时修改这些内容,我建议先“缓存”像素。例如,首先将所有色相、饱和度、值和透明度值存储为2d数组,而不是每次进行微小更改时重新调用getPixel()和Color.colorToHSV(),将大大加快代码速度。
此外,bitmap.getPixels()函数对我来说效果更好。您可以先存储它生成的数组,然后遍历它。
现在,虽然亮度/对比度可以使用类似的像素特定方法完成(将V乘以某个值,并添加一些偏移量)...锐度并不那么简单。锐度不是独立的基于颜色的修改,而是对图片本身的修改(称为“卷积”)。也就是说,变换需要知道周围像素的一些信息才能起作用。我不知道Android内置的函数是否支持这一点,但可以通过多种方式实现。
如果你想要一个“锐化”功能,我建议首先尝试使用“模糊”功能。这是一个类似的过程,但更加直观(和酷)。实际上,你可以使用模糊来锐化一幅图像。这位作者在Java中非常好地解释了这个过程(包括源代码和小程序):

http://www.jhlabs.com/ip/blurring.html


1
你能调整亮度/对比度吗?我不知道如何获取RGB的值,谢谢。 - pengwang
1
非常非常慢。 - Cyph3rCod3r
使用gpuiimage库。 - Nitesh Khosla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接