使用Haxe編程語言,是否有跨平臺的方式來讀取PNG圖像,並從圖像中獲取像素數據?使用Haxe閱讀PNG圖像
我有一個名爲stuff.png的文件,我想從圖像中獲取一個RGB值的數組(作爲整數數組)。
使用Haxe編程語言,是否有跨平臺的方式來讀取PNG圖像,並從圖像中獲取像素數據?使用Haxe閱讀PNG圖像
我有一個名爲stuff.png的文件,我想從圖像中獲取一個RGB值的數組(作爲整數數組)。
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;
}
你測試過這段代碼了嗎?我仍然爲Haxe設置FlashDevelop,所以我還沒有機會測試它。 –
這段代碼在Haxe 3.2.1中似乎不起作用('format.png.Reader'和'format.png.Tools'不存在)。 – ashes999
您可以隨時使用BitmapData.getPixels/BitmapData.setPixels訪問像素數據。
如果您使用的是haXe NME,則可以使用Assets.getBitmapData()加載資產映像文件。
如果你想從網絡加載圖像,那麼你可以使用Loader類,它可以異步加載遠程圖像,但在閃存中請注意跨域問題。
對於更通用的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);
這裏有幾個問題: .loadBytes是異步的,所以立即檢查它是不可靠的。 此外,您不需要blit內容,它們已經是位圖數據。 var bitmapData = cast(ldr.content,nme.display.BitmapData); 更簡單的解決方案: var bitmapData = nme.display.BitmapData.load(「mypng.png」); –
是的,你是對的,該文件說loadBytes是異步的,但是這實際上在nme native和flash的實踐中都是有效的。 –
嗨,我在之前的評論中誤解了這個錯誤。經測試,Loader.loadBytes()在獨立Flash播放器中同步工作,但在瀏覽器插件中異步工作,所以Matt是對的,我的代碼應該像這樣修改: var ldr = new Loader(); ldr.loadBytes(cast(byteArray)); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,function(_){ data = cast(ldr.content,Bitmap).bitmapData; }); –
爲什麼這個問題downvoted? –
它是否必須跨平臺?在Flash中,可以使用「BitmapData」完成。 –
@Banthar是的,它必須是跨平臺的。 –