Thumbs.db を AS3 で解析してサムネイル画像を取り出す

なぜかそんな必要性が出てしまったのでやってみる.

JPEG は 0xFFD8 で始まって 0xFFD9 で終わるらしいのでそこは決め打ちで,
手順は以下の通り.

  1. Thumbs.db をFileStreamで読み取る
  2. 0xFFD8 〜 0xFFD9 の間のバイト列を切り出す
  3. その 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>