2012-10-14 147 views
0

十六進制整數的Alpha值我有這個循環,運行數千次(所以必須是有效的)。它改變位圖像素的值。動態更改

我希望能夠運行以爲環和「開關」一組特定像素阿爾法,然後再切換回在稍後的點。

我的問題是。 如何切換值?所以說,0xFFCC1BE0變爲0x00CC1BE0,然後如果我想切換回0xFFCC1BE0,我只需取00並將其轉爲FF。

我不能讓兩個位圖作爲我:-(

總之這裏出現內存不足的就是我這麼遠:

private void setTransparencyOnLightMap(float WidthPercentage, float LeftPosition) 
{ 
    int blankPixel = 0x00000000; 
    int savedPixel = 0x00000000; 
    int desiredAlpha = 200; //Can also be 0x00 
    //Find away of turning alhpa off and on. 

    for(int BMx = 0; BMx < mLightMap.getWidth(); BMx++) 
    { 
     for(int BMy = 0; BMy < mLightMap.getHeight(); BMy++) 
     { 
      if(mLightMap.getPixel(BMx, BMy) != blankPixel) //Make sure don't overwrite blank transparent pixels. 
      { 
       savedPixel = mLightMap.getPixel(BMx,BMy); 
       savedPixel = savedPixel | (desiredAlpha << 24); 

       mLightMap.setPixel(BMx, BMy, savedPixel); 
      } 
     } 
    } 
} 

回答

2

你可以切換像像素的Alpha所以:

savedPixel = savedPixel & 0x00FFFFFF; 
savedPixel = savedPixel | (desiredAlpha << 24); 

第一行零出savedPixel的8個最高位顯著(這些是其中所述α-被保持在比特)第二行設置savedPixel的8最顯著位desiredAlpha。請注意,desiredAlpha必須介於0和255之間(這些是可以存儲在8位中的整數)。

請注意,這使用位運算符,(&,|,< <),這是非常有效的。

+0

這應該是'<< 24',而不是23參見[此Python代碼(HTTP://鍵盤.ORG/2s15Mqb6)。 – Eric

+0

謝謝,我會改變它。 –

+0

這是我第一次遇到按位運算符,只是花點時間去理解它們。 所以我可以切換舊的顏色? (沒有任何存儲正確?) –

1

在我看來,以減少內存佔用,可以只保存每個像素的原始阿爾法值,而不是整個ARGB值 - 要做到這一點使用一個字節數組,這將是1/4的原尺寸位圖。還可以使用一個位掩碼爲新的Alpha,所以你可以使用按位AND(&)由特里斯坦赫爾描述...

byte[] savedAlphaArray = new byte[mLightMap.getWidth(), mLightMap.getHeight()]; 
int desiredAlphaMask = 0x00FFFFFF; 
int pixel; 

然後保存阿爾法值和應用所述位掩碼做到以下幾點。 ..

for (int i = 0; i < mLightMap.getWidth(); i++) { 
    for (int j = 0; j < mLightMap.getHeight(); j++) { 
     pixel = mLightMap.getPixel(i, j); 
     savedAlphaArray[i, j] = (pixel & 0xFF000000) >> 24; 
     mLightMap.setPixel(i, j, desiredAlphaMask & pixel); 
    } 
} 

要 '開關' 回來做以下...

for (int i = 0; i < mLightMap.getWidth(); i++) { 
    for (int j = 0; j < mLightMap.getHeight(); j++) { 
     pixel = mLightMap.getPixel(i, j); 
     mLightMap.setPixel(i, j, savedAlphaArray[i, j] << 24 & pixel); 
    } 
} 
+0

對於在某些部分已經具有alpha值的png,這能否正常工作? –

+0

@AbakizMyth:說實話我真的不知道。我從來沒有嘗試過我發佈的代碼,只是在研究問題的要求。只需保存原始的Alpha,然後使用位掩碼設置它,然後使用替代代碼恢復原始的Alpha。它基本上只是十六進制邏輯。 – Squonk