我有这个循环运行数千次(因此需要高效)。它会改变位图像素的值。
我希望能够运行循环并将某组像素“切换”为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);
}
}
}
}
答案 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);
}
}