0
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();
}

基本上,跟踪语句会返回:

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

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

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

4

1 回答 1

1

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

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

首先,如果你输入cola 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 的副作用。这也可以解释为什么您看不到getPixeland有任何问题setPixel

你可以在这里阅读更多信息:http ://www.quasimondo.com/archives/000665.php

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

于 2013-08-22T08:21:51.830 回答