PNGファイル・JPEGファイルの読み込みサンプルコード(WindowsMobile/C++)
001 //////////////////////////////////////////////////////////////////////////////
002 // PNGファイル・JPEGファイルの読み込みサンプル(WindowsMobile用)
003 // 読み込んだ画像は、生のピクセル列として取得できるので、自在に加工できる。
004 // 尚、エラー処理は一切省いてあるので注意。
005 //////////////////////////////////////////////////////////////////////////////
006 bool LoadImageFile(const TCHAR *path)
007 {
008 // IImagingFactoryオブジェクトの作成
009 IImagingFactory* pImageFactory= NULL;
010 CoCreateInstance(CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER,
011 IID_IImagingFactory, reinterpret_cast<LPVOID*>(&pImageFactory));
012
013 // IImageオブジェクトの作成、及び、画像ファイルの読み込み
014 IImage* pImage= NULL;
015 pImageFactory->CreateImageFromFile(path, &pImage);
016
017 // 読み込んだ画像の情報を取得
018 ImageInfo imgInfo;
019 pImage->GetImageInfo(&imgInfo);
020
021 // 同じサイズ同じ形式のIBitmapImageオブジェクトに変換
022 IBitmapImage* pBitmap= NULL;
023 pImageFactory->CreateBitmapFromImage(pImage, 0, 0, PixelFormatDontCare,
024 InterpolationHintDefault, &pBitmap);
025
026 // IBitmapImageに変換したら、元のIImageオブジェクトは用済みなので解放する
027 pImage->Release();
028 pImage = NULL;
029
030 // まず、画像データにアクセスするためにアドレスをロックする。
031 // これにより、bitmapDataに画像の情報とピクセルデータ先頭アドレスがセットされる。
032 BitmapData bitmapData;
033 pBitmap->LockBits(NULL, ImageLockModeRead, imgInfo.PixelFormat, &bitmapData);
034
035 // インデックスカラーならパレットを取得
036 ColorPalette* pPalette = NULL;
037 if (bitmapData.PixelFormat & PixelFormatIndexed)
038 {
039 pBitmap->GetPalette(&pPalette);
040 }
041
042 //=======================================================================
043 // これで、ピクセルデータと(インデックスカラーなら)パレットが手に入った。
044 // ここで、自分の管理下にある領域にそれらをコピーする。
045 // あとは、加工するなり何なり好きに出来る。
046 //=======================================================================
047
048 // 不要になったパレットを解放
049 if (pPalette != NULL)
050 {
051 CoTaskMemFree(pPalette);
052 pPalette = NULL;
053 }
054
055 // 処理が終わったのでロック解除
056 pBitmap->UnlockBits(&bitmapData);
057
058 // 用済みとなったIBitmapImageオブジェクトを解放
059 pBitmap->Release();
060 pBitmap = NULL;
061
062 // ImagingFactoryオブジェクトの解放
063 pImageFactory->Release();
064
065 return true;
066 }