使用 Haxe 编程语言,是否有任何跨平台的方式来读取 PNG 图像,并从图像中获取像素数据?
我有一个名为 stuff.png 的文件,我想从图像中获取一个 RGB 值数组(作为整数数组)。
使用 Haxe 编程语言,是否有任何跨平台的方式来读取 PNG 图像,并从图像中获取像素数据?
我有一个名为 stuff.png 的文件,我想从图像中获取一个 RGB 值数组(作为整数数组)。
这是使用 Haxe 格式库读取 PNG 文件的示例。您需要-lib format
在编译器 args / build.hxml 中:
function readPixels(file:String):{data:Bytes, width:Int, height:Int} {
var handle = sys.io.File.read(file, true);
var d = new format.png.Reader(handle).read();
var hdr = format.png.Tools.getHeader(d);
var ret = {
data:format.png.Tools.extract32(d),
width:hdr.width,
height:hdr.height
};
handle.close();
return ret;
}
下面是如何从上面获取 ARGB 像素数据的示例:
public static function main() {
if (Sys.args().length == 0) {
trace('usage: PNGReader <filename>');
Sys.exit(1);
}
var filename = Sys.args()[0];
var pixels = readPixels(filename);
for (y in 0...pixels.height) {
for (x in 0...pixels.width) {
var p = pixels.data.getInt32(4*(x+y*pixels.width));
// ARGB, each 0-255
var a:Int = p>>>24;
var r:Int = (p>>>16)&0xff;
var g:Int = (p>>>8)&0xff;
var b:Int = (p)&0xff;
// Or, AARRGGBB in hex:
var hex:String = StringTools.hex(p,8);
trace('${ x },${ y }: ${ a },${ r },${ g },${ b } - ${ StringTools.hex(p,8) }');
}
}
您始终可以使用 BitmapData.getPixels/BitmapData.setPixels 访问像素数据。
如果您使用的是 haXe NME,则可以使用 Assets.getBitmapData() 来加载资产图像文件。
如果你想从网络加载图片,那么你可以使用 Loader 类,它可以异步加载远程图片,但在 flash 中请注意跨域问题。
对于更通用的 ByteArray -> BitmapData 转换,请使用以下代码:
var ldr = new Loader();
ldr.loadBytes(cast(byteArray)); // bytearray contains raw image data
var dp: DisplayObject = ldr.content; // actually ontent should be of Bitmap class
var bitmapData = new BitmapData(Std.int(dp.width), Std.int(dp.height), true, 0);
bitmapData.draw(dp);