是的,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(使用source / applets)方面做得非常好: