Android 使所有彩色像素不透明

Android 使所有彩色像素不透明,android,colors,colormatrix,colormatrixfilter,Android,Colors,Colormatrix,Colormatrixfilter,我正在使用一些Android股票资源,例如ic\u menu\u camera.png: 这些图像有一个透明的背景(需要),但也有一些彩色像素的透明度(不需要) 我使用ColorMatrixColorFilter对这些图像进行着色,效果很好,但是,图标中的少量透明度导致底层背景渗出,颜色褪色。我想不出一种编程方法来将所有彩色像素设置为不透明。有什么帮助吗 当前着色代码: public static void colorImageView(Context context, ImageView i

我正在使用一些Android股票资源,例如
ic\u menu\u camera.png

这些图像有一个透明的背景(需要),但也有一些彩色像素的透明度(不需要)

我使用ColorMatrixColorFilter对这些图像进行着色,效果很好,但是,图标中的少量透明度导致底层背景渗出,颜色褪色。我想不出一种编程方法来将所有彩色像素设置为不透明。有什么帮助吗

当前着色代码:

public static void colorImageView(Context context, ImageView imageView, @ColorRes int colorResId) {
    Drawable drawable = imageView.getDrawable();
    int color = context.getResources().getColor(colorResId);

    drawable.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(new float[] {
            0, 0, 0, 0, Color.red(color),
            0, 0, 0, 0, Color.green(color),
            0, 0, 0, 0, Color.blue(color),
            0, 0, 0, 1, 0,
    })));
}
当前结果:


(第一个图标的源图像是不透明的,而其他三个图标的透明度不理想,导致了这种淡蓝色)

我首先想到了一个非常简单的方法: 也许您可以将绘图转换为位图并执行所需的像素操作(如下图所示),例如:

for(int x=0;x
删除r、g或b值大于零的每个像素中的任何alpha通道值


但我不知道这种方法的效果有多差或慢。我认为转换为带有像素操作的位图可能比ColorMatrixColorFilter慢得多。

为什么不使用一些桌面工具转换图像,并将更正后的图像打包到应用程序中?请注意,您尝试做的可能是可能的,但除非您需要N种不同颜色的图像,否则我不知道您通过动态操作获得了什么。因为我需要10个图标,每个图标有5种分辨率,2种颜色。这是100张图片。另外,使用内置res可授予自动向前兼容性:/“再加上使用内置的res会授予自动前向兼容性”--不是真的。要么您正在将图标从SDK复制到项目中,要么您没有。如果是,则会获得一致性,但会失去向前兼容性。相反,如果您使用的是
android.R.drawable
引用,那么您不知道您的算法在任何给定的设备上是否会看起来不错(因为没有什么可以阻止制造商修补这些图像),更不用说在未来的安卓版本中了(例如,无论L变成什么)。尝试增加“s”值(现在是最后一个矩阵行中的1)我在考虑这个问题,这不是最整洁的解决方案,但如果有必要,我会求助于它。你可以将它与“Commonware”的想法结合起来,在一个小型java桌面工具中使用它,在将图标添加到应用程序之前获得所需的图标。最终,这个应用程序将成为可蒙皮平台的一部分,因此动态特性将是一件非常好的事情。Up投票给我。我正要发布类似的东西。我的建议是将
if(r!=0 | | g!=0 | | b!=0)
表达式更改为
if(Color.alpha(pixel)!=0)
,因为不能保证透明像素是RGB(0,0,0)。您还可以尝试
if(Color.alpha(pixel)>X)
其中
X
是一些阈值常量,但这并不能解决他的问题。他希望背景中的透明部分,而不是彩色部分。
for(int x = 0; x < bitmap.getWidth(); x++) {
    for(int y = 0; y < bitmap.getHeight(); y++) {
        int pixel = bitmap.getPixel(x, y);
        int r = Color.red(pixel), g = Color.green(pixel), b = Color.blue(pixel);
        if (r != 0 || g != 0 || b != 0)
        {
            pixel.setPixel(x, y, Color.rgb(r, g, b));
        }
    }
}