JPG形式の画像をBMPに変換する(壁紙を設定する)


キッカケは「壁紙を変更するツールを作りたい」でした。"壁紙チェンジャ"とか"壁紙セレクタ"のようなオンラインソフトは、Vectorなどを探せばたくさん登録されています。私自身、数年前に「指定した間隔で壁紙を変更する」ツールを作ったりもしました。その後いつの間にか使わなくなってしまいましたが、何となく思い出して、もう少し改良してみようかなと思い立ったわけです。

壁紙を設定するには、レジストリに情報を書き込んで、レジストリの変更を反映させるためにSystemParametersInfoをコールしてやります。

Declare Function SystemParametersInfo Lib "user32" Alias _
                           "SystemParametersInfoA" (ByVal uAction As Long, _
                                                    ByVal uParam As Long, _
                                                    ByVal lpvParam As Any, _
                                                    ByVal fuWinIni As Long) As Long
Public Const SPI_SETDESKWALLPAPER = 20
Public Const SPIF_SENDWININICHANGE = &H2
Public Const SPIF_UPDATEINIFILE = &H1
Sub Sample()
    Dim WSH, WPaper As String, re
    WPaper = "C:\Sample.bmp"
    ''レジストリに書き込み
    Set WSH = CreateObject("WScript.Shell")
    WSH.RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper", WPaper, "REG_SZ"
    Set WSH = Nothing
    ''更新
    re = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, ByVal WPaper, _
                              SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
End Sub

本当は壁紙の"表示方法"なども指定しなければならないんですが、そのへんは割愛します。このように壁紙を設定すること自体は難しくないのですが、設定できる画像はBMP形式でなければならないという問題があります。デスクトップを右クリックして[プロパティ]ダイアログボックスで指定するときは、[参照]ボタンからJPG画像を指定することもできます。それなのに、どうしてBMP画像でなければならないのでしょう。

実は[プロパティ]ダイアログボックスでJPG画像を指定した場合、Windowsが自動的にBMP形式へと変換してくれているのです。Windowsが変換したファイルは「C:\Documents and Settings\<ユーザー名>\Local Settings\Application Data\Microsoft\Wallpaper1.bmp」として保存され、そのBMPファイルが壁紙に設定されます。

ところが、ネットなどから入手した画像はJPG形式も多く、壁紙に設定するためだけにBMP形式へと変換しておくのは、何となく無駄な気がしますし、"もったいないオバケ"が出そうで恐いです。まぁ、とにかく、私が作ろうとしているツールではディスク内のJPG画像を壁紙に設定したいのです。であれば、何とかしてJPG形式をBMP形式に変換しなければなりません。

ネットを検索してみたのですが、これが意外に難しいとわかりました。APIなどで一発…と期待していたのですが、どうやらそんな便利なAPIはないそうです。ちなみに、Visual Studio 2005なら、かなり便利にできそうなことも書いてありました。そのうち試してみましょう。そんな中で見つけたのがKBC.DLLというオンラインソフトです。解説によると

KBC.DLLは明熊さん開発の「明熊JPEG保存DLL V.2.00」DLLを呼び出すことにより、BMP<->JPEG形式の相互変換するActiveX.DLLです。 一時ファイルに展開し、それを読み込むことでメモリ上に展開するようなメソッドも ついています。

当然のことながら、明熊さんのDLLが必要になります。 明熊JPEG保存DLLのVer.2.00に対応しています。Ver.1.00には対応していませんのでご注意ください。

とのこと。で、明熊JPEG保存DLLは、

ローカルに保存されたBMPファイルをJPGファイルに変換する機能、デバイスコンテキストのハンドルから直接JPEGファイルを生成する機能、そして、VBA用にクリップボード経由でJPEGファイルを生成する機能を追加しました。

だそうです。何とも素晴らしいソフトを公開していただき、心より感謝します。

KBC.DLLのページはこちら→http://homepage3.nifty.com/hippo2000/prm.htm

明熊JPG保存DLLのページはこちら→http://www.akikuma.net/download.html

それぞれの使い方は、それぞれのreadme.txtなどをご覧ください。

さっそく組み込んで、次のように変換が可能になりました。

Dim re, oKbc
Set oKbc = CreateObject("KBC.Convert")
re = oKbc.JPGtoBMP(Filename, App.Path & "\WPS_Saved.bmp")

コード全体は量が多いので書きませんが、実に簡単でした。