2012-10-14 113 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