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