Thumbs.db を AS3 で解析してサムネイル画像を取り出す
なぜかそんな必要性が出てしまったのでやってみる.
JPEG は 0xFFD8 で始まって 0xFFD9 で終わるらしいのでそこは決め打ちで,
手順は以下の通り.
- Thumbs.db をFileStreamで読み取る
- 0xFFD8 〜 0xFFD9 の間のバイト列を切り出す
- その ByteArray を Loader#loadBytes して Image で表示
あとファイルパスも取得したのだが,Thumbs.db の中にあるんだろうか...
要調査.
<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.controls.Image; import mx.controls.Alert; private function click() :void { var arr:Array = abstract(fstree.selectedPath + File.separator + "Thumbs.db"); var arr2:Array = new Array(); var i:int = 0; for each (var jpg:ByteArray in arr) { arr2.push({jpg: jpg}); } renderArea.dataProvider = new ArrayCollection(arr2); } private function abstract(path) :Array { var thumbs:File = new File(path); var fs:FileStream = new FileStream(); fs.open(thumbs, FileMode.READ); var arr:Array = new Array(); while(fs.bytesAvailable > 1) { var i:int = fs.readUnsignedShort(); if (i == 0xffd8) { var img:ByteArray = new ByteArray(); img.writeShort(0xffd8); while(fs.bytesAvailable != 0) { var j:int = fs.readUnsignedShort(); if (j == 0xffd9) { img.writeShort(0xffd9); arr.push(img); break; } else { fs.position -= 2; img.writeByte(fs.readUnsignedByte()); } } } else { fs.position -= 1; } } return arr; } ]]> </mx:Script> <mx:HDividedBox height="100%" width="100%"> <mx:VBox width="200" height="380"> <mx:FileSystemTree id="fstree" height="90%" width="100%"/> <mx:Button id="button" click="click()" label="このディレクトリのThumbs.db から抽出"/> </mx:VBox> <mx:Box width="380" height="380"> <mx:TileList id="renderArea" height="100%" width="100%" maxColumns="3" allowMultipleSelection="true" horizontalScrollPolicy="auto" selectable="false"> <mx:itemRenderer> <mx:Component> <local:Thumbnail/> </mx:Component> </mx:itemRenderer> </mx:TileList> </mx:Box> </mx:HDividedBox> </mx:WindowedApplication>
<?xml version="1.0" encoding="utf-8"?> <!-- Thumbnail.mxml --> <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="0xAFEEEE" backgroundAlpha="0.8" cornerRadius="14" borderColor="0xAAB3B3" borderSides="left top right bottom" borderSkin="mx.skins.halo.HaloBorder" borderStyle="inset" borderThickness="1" paddingLeft="5" paddingTop="5" paddingRight="5" paddingBottom="5" horizontalScrollPolicy="off" verticalScrollPolicy="off"> <mx:Script> <![CDATA[ import mx.utils.Base64Decoder; import mx.graphics.codec.JPEGEncoder; private var ldr:Loader = new Loader(); override public function set data(value:Object):void { value.jpg.position = 0; ldr.loadBytes(value.jpg); } ]]> </mx:Script> <mx:Image id="img" maxHeight="100" maxWidth="100" height="100" width="100" verticalAlign="middle" horizontalAlign="center" creationComplete="img.addChild(ldr);"/> </mx:VBox>