混沌雑記帳






WindowsMobileのTodayプラグイン作成で嵌ったPNG透過描画関連。

・PNGを使えば透過情報を使える。
・SHLoadImageFileはPNGを読み込める。
・AlphaBlendで透過付き描画が出来る。
よし、簡単じゃん。 と思ったら甘かった。
トラップは
・SHLoadImageFileはPNGを読み込めるが、デバイスにあわせる仕様のため16ビットになってしまう。
・AlphaBlendで必要とするのはアルファチャンネル付き32ビットビットマップ。
よってそのままじゃうまくいかない。
まあSHLoadDIBitmapって手もあるのかもしれないが、PNGのが作りやすし。

というわけでネットの海を探し回った結果。
めるもでらさんの所でやはり同じ問題にぶつかった記事を発見。
ちょっと変形してSHLoadImageFileと入れ替え可能な関数を作成。

HBITMAP IFLoadImageFile(const TCHAR *pszPath)
{
 // interface 取得
 IImagingFactory* pImageFactory= NULL;
 CoCreateInstance(CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER,
          IID_IImagingFactory, (LPVOID*)&pImageFactory);

 // ファイル読み込み
 IImage* pImage= NULL;
 pImageFactory->CreateImageFromFile(pszPath, &pImage);

 ImageInfo imgInfo;
 pImage->GetImageInfo(&imgInfo);

 // ビットマップの作成
 bool bAlpha = (imgInfo.PixelFormat & PIXFMTFLAG_ALPHA)? TRUE: FALSE;
 HDC hBmpDC = CreateCompatibleDC(NULL);
 HBITMAP hBmp = CreateBitmap(imgInfo.Width, imgInfo.Height, 1, (bAlpha)? 32 :24, NULL);
 SelectObject(hBmpDC, hBmp);
 RECT rcBitMap = { 0, 0, imgInfo.Width, imgInfo.Height};
 pImage->Draw(hBmpDC, &rcBitMap, NULL);

 // 解放
 pImage->Release();
 pImageFactory->Release();
 DeleteDC(hBmpDC);

 return hBmp;
}
[143] (2009/11/10(Mon) 11:29:54)

投稿パス:


名前:   題名:


パスワード:  

tdyRegStatus >> << バッチエンコ制御
Copyright © 混沌雑記帳. All Rights Reserved. [PHPウェブログシステム3 FLEUGELzネットマニア + 独自改造]