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

Tags:

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を使うとよい。

Related posts:

Trackback URL

Comments

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

  1. Flash Player 10でPV3D上の落書きを保存してみる | ClockMaker Blog on 10 月 4th, 2008 7:36 PM

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

Leave a Reply