动态更改十六进制整数的alpha值

时间:2012-10-14 18:27:04

标签: java android

我有这个循环运行数千次(因此需要高效)。它会改变位图像素的值。

我希望能够运行循环并将某组像素“切换”为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 个答案:

答案 0 :(得分:2)

您可以像这样切换像素的alpha:

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

第一行将savePixel的8个最高有效位清零(这些是保存alpha的位)。第二行将savedPixel的8个最高有效位设置为desiredAlpha。请注意,desiredAlpha必须介于0到255之间(这些是可以以8位存储的整数)
请注意,这使用了非常有效的按位运算符(&amp;,|,&lt;&lt;)。

答案 1 :(得分:1)

在我看来,为了减少内存使用,你可以保存每个像素的原始Alpha值而不是整个ARGB值 - 为此使用一个字节数组,它将是原始位图的1/4大小。还要为新的Alpha使用位掩码,以便按照Tristan Hull的描述使用按位AND(&)...

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

然后保存Alpha值并应用位掩码执行以下操作......

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