[AIR] MacとWindowsで画像ドラッグ&ドロップの挙動が違う
Tags: AIR
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 projectやICODecoder - Spark projectを使うとよい。
Related posts:
Title Link
Trackback URL
Comments
One Response to “[AIR] MacとWindowsで画像ドラッグ&ドロップの挙動が違う”
Leave a Reply
[…] [AIR] MacとWindowsで画像ドラッグ&ドロップの挙動が違う : boreal-kiss.com […]