有人可以建议我使用快速方法或图库来实现颜色效果吗?例如,我选择一种颜色,并且除了我选择的颜色之外,所有颜色的照片都会去饱和。
我尝试使用逐像素颜色检查然后替换颜色,但对于大图像来说太慢了。
int width = originalImage.getWidth();
int height = originalImage.getHeight();
int[] pixels = new int[width * height];
originalImage.getPixels(pixels, 0, width, 0, 0, width, height);
for (int x = 0; x < pixels.length; ++x) {
pixels[x] = Distance(pixels[x], fromColor) < 4 ? targetColor : pixels[x];
}
Bitmap newImage = Bitmap.createBitmap(width, height, originalImage.getConfig());
newImage.setPixels(pixels, 0, width, 0, 0, width, height);
public int Distance(int a, int b) {
return Math.abs(Color.red(a) - Color.red(b)) + Math.abs(Color.green(a) -
Color.green(b)) + Math.abs(Color.blue(a) - Color.blue(b));
}
修改
答案 0 :(得分:0)
您可以尝试检查可能的颜色RGB
值并准备HashSet
仅包含那些不应该是的颜色值
降低饱和度。似乎不应该有很多价值观。
之后,您将能够检查颜色是否应该去饱和。因此,对于新的给定颜色,您将获得相当长的预先计算,但转换照片的代码将变得更快。
它可以像这样实现(没有在Android
下测试它,只是某种Java
伪代码来表明这个想法):
// precalculation
Set<Color> keptColors = new HashSet<Color>();
final int MAX_DISTANCE = 4;
for (int r=red(fromColor)-MAX_DISTANCE; r<=red(fromColor)+MAX_DISTANCE; r++) {
for (int g=green(fromColor)-MAX_DISTANCE; g<=green(fromColor)+MAX_DISTANCE; g++) {
for (int b=blue(fromColor)-MAX_DISTANCE; b<=blue(fromColor)+MAX_DISTANCE; b++) {
if (Distance(rgb(r,g,b)), fromColor) < MAX_DISTANCE {
keptColors.add(rgb(r,g,b));
}
}
}
}
...
// in you photo processing code
keptColors.contains(pixels[x]) ? pixels[x] : targetColor;