簡體   English   中英

即時更改十六進制整數的alpha值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM