0

ByteArrayからビットマップを読み込もうとしていますが、次を使用しています。

bitmapData = new BitmapData(width, height, transparent);
bitmapData.setPixels(new Rectangle(0, 0, width, height), byteArray);

ただし、私が読んでいるビットマップにはアルファが事前に乗算されており、この方法を使用すると、一部の半透明領域に灰色のピクセルが表示されます。

コードでソースの乗算を解除する方法はありますか?または、これを回避するためにByteArrayをロードする別の方法ですか?

4

1 に答える 1

0

たとえば、シェーダー フィルターを使用して、アルファの乗算を解除できます。次のように言います。

kernel unmultiply_alpha
<   namespace : "Your Namespace";
    vendor : "Your Vendor";
    version : 1;
>
{
    input image4 src;
    output pixel4 dst;

    void
    evaluatePixel()
    {
        pixel4 samp = sampleNearest(src,outCoord());
        if (samp.a>0.1) {
            samp.r=samp.r/samp.a;
            samp.g=samp.g/samp.a;
            samp.b=samp.b/samp.a;
        }
        dst=samp;
    }
}

コードでアルファの正しいしきい値を設定するだけです。ここでアルファは間隔 0..1 にあるため、適切な値を使用してください。はい、フィルターを適用するには、まずシェーダーの PBJ を (PBJ を作成するには、Pixel Bender を使用して) ByteArray としてコードにインポートしてから、次を使用します。

var shader:Shader=new Shader(new ImportedShader() as ByteArray);
var filter:ShaderFilter=new ShaderFilter(shader);
bitmapData.applyFilter(bitmapData,bitmapData.rect,new Point(),filter);
于 2012-09-04T07:33:34.983 に答える