2011-06-24 158 views
3

我正在尝试创建一个应用程序,通过调整每个图像的查找条件来调整图像的色调,饱和度,亮度,对比度和清晰度以上领域。 喜欢在http://ronbigelow.com/articles/workflow_basic/hue-saturation_tool.jpgAndroid图像锐化,饱和度,色调,亮度和对比度

我不知道如何做到这一点,我无法找到任何在线教程。 Android有没有这样做的事情?我是否必须操纵单个像素的颜色?如果我必须弄乱像素,我该怎么做?

回答

4

是的,android有一些操作颜色的工具,比别人更容易。做特别要求所有图像的一般空间的唯一方法是修改单个像素。还有其他快速和肮脏的技巧,速度要快得多,但不够精确(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()函数特别强烈。如果您要实时修改这些内容,我建议首先“缓存”像素。例如,首先将所有HUE,SATURATION,VALUE和ALPHA值存储为2d数组,然后调用THEM而不是在每次较小的更改时调用getPixel()和Color.colorToHSV()都会大大加快代码的速度。

此外,bitmap.getPixels()函数对我来说效果更好。你可以先存储它产生的数组,然后迭代它。

现在,虽然可以使用类似的像素特定方法(将V乘以某个值并添加一些偏移量)来完成亮度/对比度......但清晰度并非如此简单。清晰度不是一个孤立的基于颜色的修改,它是对图片本身的修改(称为“卷积”)。也就是说,变换需要知道有关相邻像素的信息才能工作。我不知道这个内置的android功能。但它可以通过多种方式完成。

如果你想要一个“锐化”功能,我首先要尝试一个“模糊”功能。这是一个类似的过程,但它更直观(更酷)。而且,您实际上可以使用模糊来锐化图像。这家伙在解释这一切在Java中使用(与源/小程序)做了很好的工作:

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

+1

你可以给亮度/对比度我DONOT知道如何得到的RGB值,谢谢?您? – pengwang

+1

这是非常非常sloooooooowww –

+0

使用gpuiimage库 –

相关问题