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所做的额外位...我希望每个像素有更多的数据。
答案 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的副作用。这也可以解释为什么您没有看到getPixel
和setPixel
的任何问题。
您可以在此处详细了解:http://www.quasimondo.com/archives/000665.php
那么你如何解决这个问题呢? 使用正确的数据类型。 ByteArray
用于存储二进制数据。