[英]How to modify the alpha of an ARGB hex value using integer values in Java
[英]Change the alpha value of a hex integer on the fly
我已經運行了數千次此循環(因此需要高效)。 它更改位圖像素的值。
我希望能夠以循環的方式運行並將“一組”像素“切換”為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);
}
}
}
}
您可以像這樣切換像素的Alpha:
savedPixel = savedPixel & 0x00FFFFFF;
savedPixel = savedPixel | (desiredAlpha << 24);
第一行將savePixel的8個最高有效位清零(這些是保留alpha的位)。 第二行將savePixel的8個最高有效位設置為期望的Alpha。 請注意,desiredAlpha必須在0到255之間(這些整數可以8位存儲)。
請注意,這使用了非常高效的按位運算符(&,|,<<)。
在我看來,為了減少內存使用,您可以只保存每個像素的原始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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.