getPixel32不准确

时间:2013-08-21 20:34:57

标签: actionscript actionscript-2

function encodeBmp(s:String){
    s = Base64.Encode(s);
    var width:Number = Math.ceil(Math.sqrt(s.length/4));
    var bmp:BitmapData = new BitmapData(width,width,true,0x00000000);
    var pos:Number=0; //track position in string
    for(var x:Number=0;x<width;x++){
        for(var y:Number=0;y<width;y++){
            var col="0x";
            for(var i:Number=0;i<4;i++){
                col+=getHex(s.charAt(pos));
                pos++;
            }
            bmp.setPixel32(x,y,col);
            trace(col + " > 0x" + bmp.getPixel32(x,y).toString(16));
        }
    }
    return bmp.clone();
}

基本上,trace语句返回:

0x56326868 > 0x56326868
0x64434270 > 0x64424270
0x63794230 > 0x63794331
...

为什么getPixel32的结果与设定值的结果不同,我该如何解决?

编辑:getPixel是准确的,但没有get / setPixel32所做的额外位...我希望每个像素有更多的数据。

1 个答案:

答案 0 :(得分:1)

您使用Base64对String进行编码以将其存储在BitmapData中。我希望你不知道,或者感到羞耻。

无论如何,这就是我看到的情况:

首先,如果您将col键入为String,则会在setPixel32上收到编译错误,因为它需要uint

现在,我们可以忽略所有循环和十六进制字符串,以获得一些简单的代码来重现问题。

var bitmapData:BitmapData = new BitmapData(1, 1);
bitmapData.setPixel32(0, 0, 1682129520);
trace(bitmapData.getPixel32(0, 0));

通过使用int文字,我们可以看到它不是类型强制的问题,而是BitmapData内部的问题。这是有道理的,因为BitmapData旨在存储图形数据,因此以图形相似但不精确的方式存储图形是可以的。

你可能会看到Flash中预乘alpha的副作用。这也可以解释为什么您没有看到getPixelsetPixel的任何问题。

您可以在此处详细了解:http://www.quasimondo.com/archives/000665.php

那么你如何解决这个问题呢? 使用正确的数据类型ByteArray用于存储二进制数据。