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

2 回答 2

2

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

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

第一行将 savedPixel 的 8 个最高有效位清零(这些是保存 alpha 的位)。第二行将 savedPixel 的 8 个最高有效位设置为 desiredAlpha。请注意,desiredAlpha 必须介于 0 和 255 之间(这些是可以存储在 8 位中的整数)。

请注意,这使用了非常有效的位运算符 (&, |, <<)。

于 2012-10-14T18:51:34.043 回答
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);
    }
}
于 2012-10-14T20:12:28.110 回答