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

Java 动态更改十六进制整数的alpha值,java,android,Java,Android,我已经有了这个循环,它运行了数千次(因此需要高效)。它更改位图像素的值 我希望能够运行think循环,将某组像素“切换”为alpha,然后在稍后将其切换回alpha 我的问题是。 如何切换值?假设0xFFCC1BE0变为0x00CC1BE0,然后如果我想切换回0xFFCC1BE0,我只需取00并将其也关闭 内存不足,无法生成两个位图:-( 不管怎么说,到目前为止我得到的是: private void setTransparencyOnLightMap(float WidthPercentage,

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

我希望能够运行think循环,将某组像素“切换”为alpha,然后在稍后将其切换回alpha

我的问题是。 如何切换值?假设0xFFCC1BE0变为0x00CC1BE0,然后如果我想切换回0xFFCC1BE0,我只需取00并将其也关闭

内存不足,无法生成两个位图:-(

不管怎么说,到目前为止我得到的是:

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);
            }   
        }
    }
}
private void setTransparencyOnLightMap(浮动宽度百分比、浮动左位置)
{
int blankPixel=0x00000000;
int savedpix=0x00000000;
int desiredAlpha=200;//也可以是0x00
//找到关闭和打开alhpa的方法。
对于(int BMx=0;BMxsavedPixel=savedPixel |(desiredAlpha您可以像这样切换像素的alpha:

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

savedPixel=savedPixel |(desiredAlpha您可以像这样切换像素的alpha:

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

savedPixel=savedPixel |(desiredAlpha在我看来,为了减少内存使用,您可以只保存每个像素的原始Alpha值,而不是整个ARGB值-为此,使用一个字节数组,其大小为原始位图的1/4。还可以为新Alpha使用位掩码,以便可以使用位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);
    }
}
for(int i=0;i>24;
mLightMap.setPixel(i、j、所需的alphamask和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);
    }
}
for(int i=0;imLightMap.setPixel(i,j,savedAlphaArray[i,j]在我看来,为了减少内存使用,您可以只保存每个像素的原始Alpha值,而不是整个ARGB值-为此,请使用一个字节数组,其大小为原始位图的1/4。还可以为新Alpha使用位掩码,这样您就可以使用位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);
    }
}
for(int i=0;i>24;
mLightMap.setPixel(i、j、所需的alphamask和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);
    }
}
for(int i=0;imLightMap.setPixel(i,j,savedAlphaArray[i,j]应该是
这是我第一次遇到位运算符,只是花了一些时间来理解它们。所以我可以重新打开旧颜色?(没有任何存储正确吗?)不,您必须存储旧的alpha。您不能在切换之前将其切换回,因为alpha可以是任何内容。但是,alpha只有2个字节。如果您想将alpha切换回,请执行与上面相同的操作,替换“desiredAlpha”使用旧的alpha值。但是我没有旧的值,所以无法关闭前2位并再次打开它们?如果旧值是常量,那么可以这样做。否则,我建议将旧值存储在某种数组中。这应该是
这是我第一次遇到位运算符s、 只是花点时间去理解它们。这样我就可以重新打开旧颜色了?(没有任何正确的存储?)不,您必须存储旧的alpha。您不能在切换之前将其切换回,因为alpha可以是任何内容。但是,alpha只有2个字节。如果您想将alpha切换回,请执行与上面相同的操作,替换“desiredAlpha”使用旧的alpha值。但我没有旧值,因此无法关闭前2位并再次打开它们?如果旧值是常量,那么您可以这样做。否则,我建议将旧值存储在某种数组中。这对某些部分已经有alpha值的png有效吗?@aBakizMystion:老实说,我真的不知道。我从来没有尝试过我发布的代码,只是在解决问题的要求。只需保存原始Alpha,然后使用位掩码设置它,然后使用替代代码恢复原始Alpha。它基本上只是十六进制逻辑。这对已经有Alpha va的png有效吗有些地方有什么价值?@AbakizMyth:老实说,我真的不知道。我从来没有尝试过我发布的代码,只是在研究问题的要求。只需保存原始Alpha,然后用位掩码设置它,然后用其他代码恢复原始Alpha。基本上只是十六进制逻辑。