0

我正在尝试从 ByteArray 读取位图,我正在使用:

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

但是,我正在读取的位图具有预乘 alpha,并且使用此方法最终会在某些半透明区域中出现灰色像素。

有没有办法可以取消代码中的源代码?或者可能以不同的方式加载 ByteArray 来解决这个问题?

4

1 回答 1

0

例如,您可以使用着色器过滤器对 alpha 进行反乘。像这样说:

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

只需在代码中为 alpha 设置正确的阈值。这里 alpha 在区间 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 回答