Android 安卓色彩飞溅

Android 安卓色彩飞溅,android,image-processing,pixel,photo,Android,Image Processing,Pixel,Photo,有人能给我推荐一个快速的方法或者一个色斑效果库吗?例如,我选择了一种颜色,一张照片除我选择的颜色外,其他所有颜色的饱和度都会降低 我曾尝试过使用逐像素颜色检查,然后替换颜色,但对于大图像来说速度太慢 int width = originalImage.getWidth(); int height = originalImage.getHeight(); int[] pixels = new int[width * height]; originalImage.getPixels(pixels,

有人能给我推荐一个快速的方法或者一个色斑效果库吗?例如,我选择了一种颜色,一张照片除我选择的颜色外,其他所有颜色的饱和度都会降低

我曾尝试过使用逐像素颜色检查,然后替换颜色,但对于大图像来说速度太慢

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));
}
int-width=originalImage.getWidth();
int height=originalImage.getHeight();
int[]像素=新int[宽度*高度];
获取像素(像素,0,宽度,0,0,宽度,高度);
用于(int x=0;x
编辑:

这是原始图像和经过处理的图像,我保留的颜色是#ff9350:

您可以尝试检查可能的颜色
RGB
值,并准备
HashSet
仅包含那些不应该显示的颜色值 去饱和。似乎不应该有太多的价值观

之后,您将能够检查颜色是否应去饱和。因此,对于新的给定颜色,您将获得相当长的预计算时间,但转换照片的代码将变得更快

它可以像这样实现(没有在
Android
下测试过,只是某种
Java
伪代码来展示这个想法):

//预计算
Set keptColors=newhashset();
最终int最大距离=4;

for(int r=红色(fromColor)-最大距离;r@AnderBiguri是的,我的Maskk是我以前的评论中的预期输出图像,你用什么语言?这太慢了。你可能不得不把这个部分分解成C++并在氖中做操作。如果一切都做得正确,你可以为32位的int型和16倍的理论加速,而不是为4位的int。eak Android,所以我看不到你去饱和的代码-你能添加它吗,或者识别做这件事的行吗?这段代码只检查颜色是否与我选择的颜色相似,而且它本身很慢,颜色变化更慢。我如何检查所有可能的颜色RGB?我添加了一个可能的实现示例为什么哈希计算比距离计算快吗?
hashset
计算并不快,但是当计算
hashset
时,您不需要计算每个像素上的颜色距离,您只需查找其颜色是否存在于
hashset
中,这比颜色距离计算快。因此您需要在开始处理照片之前需要一段时间,但之后处理速度会更快。经过一些思考后,我意识到,使用距离计算算法,在
fromColor
color component value周围传递±4个值就足够了,以获得所有通过距离检查的值。我改进了算法,但是检查仍然存在额定颜色分量值在其限值内(0..255)省略,请自行添加
// 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;