[BlueLeaf1336]> PROGRAM>

Windowsに画像や動画のサムネイルを作ってもらう

historyTOP

2006/05/21:作成

2006/05/21TOP

エクスプローラの表示メニューで縮小表示を選択したとき、画像や動画のサムネイルが表示されますが、このとき「Thumbs.db」という悪名高いファイルが作成されます。

最初はうっとうしいなぁと思っていましたが、最近はそんなに気にならなくなってきました。わざわざ中身を開かなくてもおおよそのイメージがつかめるので(それこそサムネイルの目的なので当然ですが)、子供の成長記録な写真がわんさかあるフォルダや、アレな動画がごっそりあるフォルダなんかではよく「縮小表示」にしています。

さて、それはそれとして、Windowsがどうやってあのサムネイルを作っているのか、というのを調べてみました。すると、もろなサンプルが見つかりました。

上は自前でサムネイルを作成されていて、Windowsに作成させたところ圧倒的にそっちの方が早くてへこんでいるところで、下はへこんだ方が参考にされたサイトです。で、下のサンプルは実際には、画像などのサムネイルじゃなくて、HTMLファイルをサムネイル表示するためのサンプルです。

いずれにしても、IExtractImage というインターフェースを使ってWindowsにサムネイルを作らせることができることが書いてあります。

まず、下のサイトからソースをダウンロードして見てみると、こんなコードがあります。

FUnknown := CreateComObject(ProgIDToClassID('Shell.ThumbnailExtract.HTML.1'));

HTML ファイルのサムネイルを作成するためのシェルの何かを作成しているなぁとわかります。で、この文字列(Shell.ThumbnailExtract.HTML.1)はレジストリに書いてあるはずなので regedit を使って検索してみることにします。ただし検索文字列は Shell.ThumbnailExtract. としました。すると...

HKEY_CLASSES_ROOT\CLSID\

[-]{3F30C968-480A-4C6C-862D-EFC0897BB84B}
    ・(既定)=GDI+ file thumbnail extractor
├InprocServer32
|  ・(既定)=C:\WINDOWS\system32\shimgvw.dll
|  ・ThreadingModel=Apartment
├ProgID
|  ・(既定)=Shell.ThumbnailExtract.GdiPlus.1
└VersionIndependentProgID
    ・(既定)=Shell.ThumbnailExtract.GdiPlus.1

[-]{9DBD2C50-62AD-11D0-B806-00C04FD706EC}
    ・(既定)=Summary Info Thumbnail handler (DOCFILES)
├InprocServer32
|   ・(既定)=C:\WINDOWS\system32\shimgvw.dll
|   ・ThreadingModel=Apartment
├ProgID
|   ・(既定)=Shell.ThumbnailExtract.Docfile.1
└VersionIndependentProgID
    ・(既定)=Shell.ThumbnailExtract.DocFile.1

[-]{EAB841A0-9550-11CF-8C16-00805F1408F3}
    ・(既定)=HTML Thumbnail Extractor
├InprocServer32
|   ・(既定)=C:\WINDOWS\system32\shimgvw.dll
|   ・ThreadingModel=Apartment
├ProgID
|   ・(既定)=Shell.ThumbnailExtract.HTML.1
└VersionIndependentProgID
    ・(既定)=Shell.ThumbnailExtract.HTML.1

という3種類の Shell.ThumbnailExtract. が見つかりました(実際には、GUIDと名前の逆引き・正引きなど重複してヒットしましたがその辺はアレで)。あぁ、このうちの HTML 用のを使ったのが、下のサイトのサンプルかと納得したところで、ダウンロードしたソースのうち、「HTML」の部分を「GdiPlus」に変えてみると、今度は画像ファイル(試したのは、.bmp / .jpg / .png)のサムネイルを作らせることができました。

じゃあ動画はどうやねん、と思い、「DocFile」にしたところ、これは違っていて実際のところなんのためのものかわからないままです。少しだけ考えて、今度は、「thumbnail extractor」でレジストリを検索してみることにしました。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved
    ・{3F30C968-480A-4C6C-862D-EFC0897BB84B} = GDI+ file thumbnail extractor
    ・{c5a40261-cd64-4ccf-84cb-c394da41d590} = Video Thumbnail Extractor
    ・{EAB841A0-9550-11cf-8C16-00805F1408F3} = HTML Thumbnail Extractor

あきらかに怪しい名前の「Video Thumbnail Extractor」なるものが見つかりました。というわけで、さっきのソースコードを

FUnknown := CreateComObject(StringToGUID('{c5a40261-cd64-4ccf-84cb-c394da41d590}'));

と変更して試してみると、動画のサムネイルを取得できるようになりました。ただし、動画用か画像用かを区別してやらないとだめなようです。つまるところ、拡張子か何かでどっちのアレを CreateComObject するか切り替えたら、画像も動画もいけるやん、ええやん、これやん。と。

さて、参考にされた方のソースは読んだので、参考にした方のソースを読んでみました(明らかにダウンロードせずにHTML化されているこっちを先に読みそうなもんですが...)。あれ? 拡張子なんか見てないし、どっちの「Extractor」を作るかとかの切り替えなんてしてない。にもかかわらず、サムネイル表示のスクリーンショットを見てみると、画像ファイルも動画ファイルもサムネイル表示できています。多分、どの「Extractor」を使うのかまで含んでWindowsに任せている感じです。多分そうです。最初にこっち読んどくんだったぁ。

でも、両方のプロジェクトをダウンロードして、片方は regedit で調べた Video Thumbnail Extractor を明示的に CreateComObject して、もう片方はダウンロードしたそのままで比べてみると、Video Thumbnail Extractor の方が縦横比が賢くサムネイルされているような。気のせいかも知れませんが。もう少し調べて見たくなるようなならないような。

EOFTOP