0

私は何千回も実行されるこのループを持っています(したがって効率的である必要があります)。ビットマップピクセルの値を変更します。

ループを考えて実行し、特定のピクセルグループをアルファに「切り替え」て、後で元に戻すことができるようにしたいと思います。

私の質問はです。値を切り替えるにはどうすればよいですか?したがって、0xFFCC1BE0が0x00CC1BE0になるとすると、0xFFCC1BE0に戻したい場合は、00を取得してFFにします。

メモリが不足しているため、2つのビットマップを作成できません:-(

とにかくここに私がこれまでに持っているものがあります:

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);
            }   
        }
    }
}
4

2 に答える 2

2

次のように、ピクセルのアルファを切り替えることができます。

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

最初の行は、savedPixelの最上位8ビットをゼロにします(これらはアルファが保持されているビットです)。2行目は、savedPixelの最上位8ビットをdesiredAlphaに設定します。desiredAlphaは0から255の間でなければならないことに注意してください(これらは8ビットで格納できるintです)。

これは非常に効率的なビット演算子(&、|、<<)を使用することに注意してください。

于 2012-10-14T18:51:34.043 に答える
1

私には、メモリ使用量を減らすために、ARGB値全体ではなく、各ピクセルの元のAlpha値を保存することができます。これを行うには、元のビットマップの1/4のサイズのバイト配列を使用します。また、新しいAlphaにはビットマスクを使用して&、Tristan Hullで説明されているようにビット単位のAND()を使用できるようにします。

byte[] savedAlphaArray = new byte[mLightMap.getWidth(), mLightMap.getHeight()];
int desiredAlphaMask = 0x00FFFFFF;
int 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);
    }
}
于 2012-10-14T20:12:28.110 に答える