5

Haxe プログラミング言語を使用して、クロスプラットフォームで PNG 画像を読み取り、画像からピクセル データを取得する方法はありますか?

stuff.png というファイルがあり、画像から RGB 値の配列を (整数配列として) 取得したいと考えています。

4

2 に答える 2

3

PNG ファイルを読み取るための Haxe フォーマット ライブラリの使用例を次に示します。-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) }');
    }
  }
于 2012-12-27T03:28:26.043 に答える
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);
于 2012-12-28T11:46:27.693 に答える