— boreal-kiss.com

[AIR] MacとWindowsで画像ドラッグ&ドロップの挙動が違う

NativeDragEvent.NATIVE_DRAG_DROPイベントで、ドロップされた画像ファイルのビットマップデータを取得したい。MacとWindowsともに動作する方法を模索した。

1. Clipboardデータから直接取得する

Macの場合以下の一行でJPG, GIF, PNG, BMP, ICOファイルのビットマップデータが直接取得できるが、Windowsだと取得できない。

//NativeDragEvent.NATIVE_DRAG_DROPのイベントリスナー
function onDragDrop(e:NativeDragEvent):void{
    var bmd:BitmapData = e.clipboard.getData(ClipboardFormats.BITMAP_FORMAT) 
                        as BitmapData;
}

2. Loader.load()を使用する

次にClipboard内のファイルパスをLoaderクラスに渡してLoaderクラスのプロパティ経由でビットマップデータを取得してみる。Macだと以下の方法で取得できるが、Windowsだと取得できない。

//NativeDragEvent.NATIVE_DRAG_DROPのイベントリスナー
function onDragDrop(e:NativeDragEvent):void{
    var path:String = e.clipboard.getData(ClipboardFormats.URL_FORMAT).toString();
    var loader:Loader = new Loader();
    loader.load(new URLRequest(path));
    loader.contentLoaderInfo.addEventListener(Event.INIT,onInit);
}

function onInit(e:Event):void{
    var bmd:BitmapData = e.target.content.bitmapData as BitmapData;
}

3. Loader.loadBytes()を使用する

結局Windows(とMac)でビットマップデータにアクセスするためにはどうすればよいかというと、一つの方法は(僕はこれしか成功していない)、ドロップされる画像ファイルに割り当てられたFileクラスオブジェクトのデータをByteArrayにしてからBitmapDataに変換してやることだ。この方法だとWindows、Macともにドロップされた画像ファイルのビットマップデータを取得できる。

//NativeDragEvent.NATIVE_DRAG_DROPのイベントリスナー
function onDragDrop(e:NativeDragEvent):void{
    var files:Array = e.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT)
                        as Array;
    var f:File = files[0];
    var fs:FileStream = new FileStream();
    var ba:ByteArray = new ByteArray();
    fs.open(f,FileMode.READ);
    fs.readBytes(ba,0,fs.bytesAvailable);
    fs.close();

    var loader:Loader = new Loader();
    loader.loadBytes(ba);
    loader.contentLoaderInfo.addEventListener(Event.INIT,onInit);
}

function onInit(e:Event):void{
    var bmd:BitmapData = e.target.content.bitmapData as BitmapData;
}

ただしLoaderクラスを使うのでJPG, GIF, PNGファイルしか扱えない。BMPやICOファイルを扱いたい場合は、別途BMPDecoder – Spark projectICODecoder – Spark projectを使うとよい。

1 comment
  1. […] [AIR] MacとWindowsで画像ドラッグ&ドロップの挙動が違う : boreal-kiss.com […]

Submit comment