2014-08-30 37 views
-1

我使用的是一些普通的Android資源,如ic_menu_camera.png使所有顏色的像素不透明

enter image description here

的圖像有一個透明的背景(需要),但也有一些透明的彩色像素也是(不希望的)。

我正在使用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, 
    }))); 
} 

當前結果:

enter image description here

(第一圖標的源圖像是不透明的,而其它3具有不希望的透明度,從而導致這個截止藍色)

+1

爲什麼不只是使用一些桌面工具轉換圖像,並在您的應用程序打包更正的圖像?請注意,你試圖做的事情可能是可能的,但除非你需要N種不同顏色的圖像,否則我不知道你在飛行中獲得什麼。 – CommonsWare 2014-08-30 23:18:05

+0

因爲有10個圖標,我需要5個分辨率和2種顏色。這是100張圖片。另外使用內置的資源授權自動向前兼容性。 :/ – Alexander 2014-08-30 23:24:39

+1

「Plus使用內置的資源授權自動向前兼容性」 - 並非如此。您要麼將SDK中的圖標複製到您的項目中,要麼不是。如果你是,那麼你獲得一致性,但失去向前兼容性。相反,如果你正在使用'android.R.drawable'引用,那麼你不知道你的算法在任何給定的設備上看起來不錯(因爲沒有什麼能夠阻止製造商修改這些圖像),更不用說在未來的版本中的Android(例如,無論L變成什麼)。 – CommonsWare 2014-08-30 23:27:11

回答

2

我首先想到了一個非常簡單的方法: 也許你可以將Drawable成位圖,並執行所需的像素操作(如在此answer),e.g:

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)); 
     } 
    } 
} 

刪除在每個像素中的任何alpha通道值與R-,G-或b值大於零。

但我不知道,這種方法工作有多差或很慢。我認爲使用像素操作轉換爲位圖可能比ColorMatrixColorFilter慢得多。

+0

我正在考慮這個問題,這不是最好的解決方法,但是如果必須的話,我會採用它。 – Alexander 2014-08-30 23:31:55

+0

您可以將它與'CommonsWare的想法結合起來,並在小型Java桌面工具中使用它來在將應用程序添加到應用程序之前獲取所需的圖標。 – 2014-08-30 23:35:31

+0

最終,這個應用程序將成爲skinnable平臺的一部分,所以動態性將是一件非常好的事情。 – Alexander 2014-08-30 23:38:48