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 }