JPEGロード法
:::::::::::::::::::::::::::::::::::::::::::::

このテキストは、ある程度プログラムが理解できる方を

対象にしております。

:::::::::::::::::::::::::::::::::::::::::::::

ぶっちゃけた話、読み込み方法は3種類です。

ファイル構造とアルゴリズムを学習し、自分で展開ルーチンを組む。
どっかからライブラリを持ってきて、使用。
APIで一発変換


言うまでも無く、一番ラクなのは2番ですが、

今回は要望により、3番で行きます。

1、2番については、要望があれば追って調査、報告いたします。

:::::::::::::::::::::::::::::::::::::::::::::

APIでJPEGを読み込む方法

以下は、JPGを指定のディバイスコンテキストへ描画するまでの

手順と使用関数をまとめた表です。




これを使えば、JPGの画像をDIBへ変換したり、

BMP形式で保存したりも出来ると思います。




変数の型などは、関数のリファレンスを見て

自分で調べていただくのが宜しいかと思います。



手順 やること 関数、変数(例)
@ (JPG)ファイルを開く hFile = CreateFile("gw2.jpg", GENERIC_READ, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
A ファイルサイズ取得 nFileSize = GetFileSize(hFile, NULL);
B バッファの確保、データ読み込み hGlobal = GlobalAlloc(GPTR, nFileSize);
ReadFile(hFile, hGlobal, nFileSize, &nReadByte, NULL);
C データストリームの作成 CreateStreamOnHGlobal(hGlobal, TRUE, &iStream);
D ストリームから画像データの読み込み OleLoadPicture(iStream, nFileSize, TRUE, &IID_IPicture, (LPVOID*)&iPicture);
E 画像サイズを保存 iPicture->lpVtbl->get_Width(iPicture,&lWidth);
iPicture->lpVtbl->get_Height(iPicture,&lHeight);
F DCに描画 hDC = GetDC(hWnd);
iPicture->lpVtbl->Render(iPicture,hDC, 0, 0, lWidth/32, lHeight/32, 0, lHeight, lWidth, -lHeight, NULL);
ReleaseDC(hWnd,hDC);
G 後処理 CloseHandle(hFile)
iPicture->lpVtbl->Release(iPicture);
GlobalFree(hGlobal);


以上です。



変数の型さえ分かれば、このまま使用出来るかと思います。





ちなみに、APIでJPEGを読む場合、その他にも

LoadImage,SetDIBitsToDevice等の関数でも

読み込みは可能なようです。



特にSetDIBitsToDeviceの方は、上で示したOleLoadPicture

を使用した例より、速度が速いとのこと。

時間があれば、それらの関数での読み込みも調べようかと思います。




注意
OleLoadPictureでは、GIFも一応読み込めますが、色々と問題があるので気をつけましょう。





















クラス化したものがここにあります。

文字を反転とかしないように

:::::::::::::::::::::::::::::::::::::::::::::
も・・・戻るのか?正気か!?