VC++6でGDI+メモ

追記
2011年4月の時点で、まだこの記事にソコソコのアクセスがあるようなので一応書いておきますが、この記事に書かれている「PlatformSDK February 2003」は、たぶんもう手に入りません。(少なくともマイクロソフト公式からはダウンロード出来ない様子)
どうにかしてPSDKを探すか、GDI+を諦めるか、VC6を諦めるかなさそうです。
VC6を諦めるをオススメ

更に追加
2017年7月時点でMSDNで検索した結果、一応まだダウンロードできるようです。
https://www.microsoft.com/en-us/download/details.aspx?id=12261
もしまたダウンロード出来ない(上記URLが無くなってる)としても、MSDNで「PlatformSDK 2003」で検索すると出てくるかもしれません。
また、下記のインストールの方法とは変わっており、インストーラーでインストールするので簡単になっているようです。

Javaとか.NETみたいな、メモリ管理を自動でやってくれる言語に慣れきったヌルプログラマの私は、C言語みたいな自分でメモリ管理しなきゃいけない言語が拒絶反応がでるくらい苦手になってたりします。
が、仕事では好き嫌いできないわけで、先週もVC++で画像を読み込んだり表示したり保存したりするプログラムを組むことになったのですが、けっこうハマったのでメモしておく。

同じようにハマってる人が、一人でも救われれば、このエントリーは十分な意味を持つだろう。
とか言ってみたり


jpgやgifやpngやbmpを読み込んで表示して保存するには、GDI+を使うのが一番楽そうだったので使うことにする。

GDI+はPlatformSDK(以降 PSDK)に含まれているのだけど、最新版のPSDKはVC6をサポートしていないらしく、デバッグビルド時に
「fatal error LNK1103: デバッグ情報が壊れています」
とか怒られる。

怒られないためには、
1.VC6をサポートした最後のPSDKである「PSDK February 2003」を下記URLより入手する。
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
ここでDLするファイルは
PSDK-Full.1.cab ~ PSDK-Full.13.cab 、BAT File for Extraction、Extraction Utility File

2.PSDK February 2003より新しいPSDKがインストールされている場合は、アンインストールしておく。

3.全部のファイルを落としたら、PSDK-Full.batを実行する。
たしかC:TempにSetup.exeが出来た気がするので、それを実行すると、IEが立ち上がる。
ActiveXやらなにやらを使ってインストールするっぽいので、普段使用するブラウザがIE以外だとうまくいかないらしい。

4.画面左側のメニューからCoreSDKを選んで、インストールを開始する。ちょっと時間が掛かった。

5.インストールが完了したら、スタートメニュー→プログラムに追加された「Platform SDK February 2003」とかそんな感じのメニューの中にある、Register for Visual Studioとかそんな感じの英語のメニューから、VisualStudioに登録する的な英語のメニューを選んでVisualStudioから使えるようにする。

これでVC6でGDI+が使えるようになる。


GDI+の基本的な使い方はググれば判りやすいページが色々でてくるので割愛。

GDI+で一番簡単に画像ファイルを読み込む方法は、

Gdiplus::Image myImage(画像ファイルパス);

なんだけど、この方法で読み込むと、上の例だとmyImageが開放されるまで画像ファイルがロックされてしまい、例えば同じファイル名で保存することが出来ない。

色々とググってみたけど、一旦メモリに読み込んでから、IStreamインターフェース経由で読み込むとかそんな感じの(よく覚えてない)ことが書かれていたけど、なんかめんどくさそうだったし、何よりmallocとかでメモリ確保するのが嫌いなのでやりたくなかったので、別の方法を考えた。

Gdiplus::Bitmap tmpBitmap(画像ファイルパス);                              //画像ファイル読み込み
Gdiplus::Bitmap myBitmap(tmpBitmap.Width, tmpBitmap.Height);  //保存用Bitmapオブジェクト生成
Gdiplus::Graphics grp(myBitmap);                                           //描画用
grp.DrawImage(&tmpBitmap, 0,  0, tmpBitmap.Width, tmpBitmap.Height); //描画
delete grp;             //描画用Graphicsオブジェクト開放
delete tmpBitmap;   //読み込んだ画像ファイル開放

かなり適当に書いたけど、ニュアンスが伝わればよし。
やってることは単純で、読み込んだ画像を別のBitmapオブジェクトにコピーして閉じてるだけ。んでコピーしたほうを使えばいい。
こんな感じで、myBitmapにファイルから読み込んだ画像を保持すれば、画像ファイルがロックされることもなく、同名で保存することも出来ます。
ただ、計って無いけどパフォーマンスはあんまし良く無い気がする。なんとなく。
高速に何枚も読むのでなければ、これで十分だと思う。


.NETならもっと楽なんだけどなぁ・・・


追記
こちらでなんか参考にされたっぽい?
役に立てたのかな。よかったよかった。

こういうのも相互リンクっていうんかな。つか相互リンクって文字列久しぶりに書いたかも。
ブログ的にはトラックバックとかするんですかね。よくわからんです。なんか怖いし。人見知りするので。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

認証のために問題を解いて下さい * Time limit is exhausted. Please reload CAPTCHA.