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/getPixel 32那样的额外位.我希望每个像素有更多的数据。
发布于 2013-08-22 08:21:51
您正在对字符串进行Base64编码,以便将其存储在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中看到了预倍增α的副作用。这也解释了为什么您看不到getPixel和setPixel的任何问题。
你可以在这里读到更多关于它的信息:http://www.quasimondo.com/archives/000665.php
那么如何解决这个问题呢?使用正确的数据类型。ByteArray用于存储二进制数据。
https://stackoverflow.com/questions/18367157
复制相似问题