2012-12-26 37 views
2

使用Haxe編程語言,是否有跨平臺的方式來讀取PNG圖像,並從圖像中獲取像素數據?使用Haxe閱讀PNG圖像

我有一個名爲stuff.png的文件,我想從圖像中獲取一個RGB值的數組(作爲整數數組)。

+2

爲什麼這個問題downvoted? –

+0

它是否必須跨平臺?在Flash中,可以使用「BitmapData」完成。 –

+0

@Banthar是的,它必須是跨平臺的。 –

回答

1
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; 
} 
+0

你測試過這段代碼了嗎?我仍然爲Haxe設置FlashDevelop,所以我還沒有機會測試它。 –

+0

這段代碼在Haxe 3.2.1中似乎不起作用('format.png.Reader'和'format.png.Tools'不存在)。 – ashes999

0

您可以隨時使用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); 
+0

這裏有幾個問題: .loadBytes是異步的,所以立即檢查它是不可靠的。 此外,您不需要blit內容,它們已經是位圖數據。 var bitmapData = cast(ldr.content,nme.display.BitmapData); 更簡單的解決方案: var bitmapData = nme.display.BitmapData.load(「mypng.png」); –

+0

是的,你是對的,該文件說loadBytes是異步的,但是這實際上在nme native和flash的實踐中都是有效的。 –

+0

嗨,我在之前的評論中誤解了這個錯誤。經測試,Loader.loadBytes()在獨立Flash播放器中同步工作,但在瀏覽器插件中異步工作,所以Matt是對的,我的代碼應該像這樣修改: var ldr = new Loader(); ldr.loadBytes(cast(byteArray)); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,function(_){ data = cast(ldr.content,Bitmap).bitmapData; }); –