2010-11-22 47 views
1

我有一些png文件正在應用顏色。顏色根據用戶選擇而改變。我通過另一種方法設置的3個RGB值更改顏色。 png文件是一個隨機形狀,在形狀之外具有完全透明度。我不想修改透明度,只有RGB值。目前,我正在逐個像素地設置RGB值(請參閱下面的代碼)。設置一個(PNG)位圖顏色而不是像素的更快方法

我已經意識到這是非常慢,可能只是沒有足夠的效率在應用程序中。有沒有更好的方法可以做到這一點?

這是我目前正在做的。你可以看到,像素陣列是巨大的,佔用了屏幕的體面部分的圖像:

public void foo(Component component, ComponentColor compColor, int userColor) { 
    int h = component.getImages().getHeight(); 
    int w = component.getImages().getWidth(); 
    mBitmap = component.getImages().createScaledBitmap(component.getImages(), w, h, true); 

    int[] pixels = new int[h * w]; 

    //Get all the pixels from the image 
    mBitmap[index].getPixels(pixels, 0, w, 0, 0, w, h); 

    //Modify the pixel array to the color the user selected 
    pixels = changeColor(compColor, pixels); 

    //Set the image to use the new pixel array 
    mBitmap[index].setPixels(pixels, 0, w, 0, 0, w, h); 
} 

public int[] changeColor(ComponentColor compColor, int[] pixels) { 
    int red = compColor.getRed(); 
    int green = compColor.getGreen(); 
    int blue = compColor.getBlue(); 
    int alpha; 

    for (int i=0; i < pixels.length; i++) { 
     alpha = Color.alpha(pixels[i]); 
     if (alpha != 0) { 
      pixels[i] = Color.argb(alpha, red, green, blue); 
     } 
    } 
    return pixels; 
} 
+1

也許你可以使用一個圖像與一個調色板?由於所有內容都使用一種顏色,這意味着無論如何,只能從一個輸入中獲得256種可能的像素顏色(因爲RGB部分將是相同的,並且只有A部分會有所不同)。如果您的圖像具有256種不同顏色的調色板,而這些顏色只與alpha通道的值不同,則只需修改調色板,而不是圖像數據本身。 – 2010-11-22 23:06:49

+0

我要麼不理解你,要麼你不瞭解我的問題。我想修改的每個圖像都有2個alpha值,完全透明和半透明/不透明。我想修改RGB值並保持alpha值相同。這就是說,雖然我得到調色板的概念,但在android中沒有Palette類。你建議我讀什麼? – user432209 2010-11-22 23:32:06

回答

2

你看在Bitmap可用的功能?像extractAlpha聽起來像它可能是有用的。你也可以看看在Android中實現的功能的方式,看看如果它不能完全滿足你的需求,你會如何適應你的特定情況。

1

爲我工作的答案是寫了廣場在這裏做Transparent jpegs

他們提供了這樣做確切的事情更快的代碼段。我嘗試了extractAlpha,但它沒有工作,但Square的解決方案。只需修改他們的解決方案,而不是修改顏色位而不是alpha位。

pixels[x] = (pixels[x] & 0xFF000000) | (color & 0x00FFFFFF); 
相關問題