コードの使用
GDI+にWIC画像を読み込むには、LoadHdPhotosクラスと静的メンバ関数GetImage()を使用します。
class LoadHdPhotos
{
public:
static bool GetImage(
CComPtr<IWICImagingFactory> imagingFactory,
const std::wstring& szFile,
Gdiplus::Bitmap*& pbmp,
Gdiplus::Bitmap*& pImageThumb );
};
GetImage()関数を使用するには、まずIWICImagingFactoryオブジェクトを作成する必要があります。このファクトリオブジェクトをLoadHdPhotosにカプセル化していないのは、これは一度作成した後、画像の読み込みや保存の際に何度も使用するオブジェクトだからです。
この関数を使用したコードの例をいくつか見てみましょう。
m_ImagingFactory.CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER );
if(m_ImagingFactory)
{
using namespace Gdiplus;
Bitmap* pImageThumb = NULL;
bool bRet = LoadHdPhotos::GetImage(
m_ImagingFactory,
L"E:\\Media\\MyImage.hdp",
m_pbmp,
pImageThumb );
if( bRet && m_pbmp!= NULL )
{
// after getting the GDI+ image, display it or do further processing.
CClientDC dc(this);
Graphics graphics(dc.GetSafeHdc());
graphics.DrawImage(m_pbmp,0,0,m_pbmp->GetWidth(),m_pbmp->GetHeight());
}
}
さらに処理を続けると、得られた画像を保存したくなるかもしれません。画像の保存には、SaveHdPhotosクラスを使用します。SaveHdPhotosクラスは単純に、WICサンプルツールに含まれているサンプルコードWICExplorerのCimageTransencoderクラスをラップしたものです。
SaveHdPhotos save;
save.SetLossless(false);
save.SetCompressionQuality(0.8f);
save.SetImageQuality(0.8f);
save.SetDpi( (double)m_pbmp->GetHorizontalResolution(),
(double)m_pbmp->GetVerticalResolution() );
save.SetPixelFormat( GUID_WICPixelFormat24bppBGR );
save.Begin(
L"E:\\Media\\MyImage2.hdp",
m_ImagingFactory);
if( m_pbmp && pImageThumb )
save.AddFrame( m_pbmp, pImageThumb );
else if( m_pbmp )
save.AddFrame( m_pbmp, NULL );
save.End();
画像の変換
異なる画像形式に変換するときは、LoadHdPhotosやSaveHdPhotosを使用しないでください。これらのクラスは、画像を変換する方法としてはきわめて回りくどく非効率なGDI+を使用するからです。代わりに、WICを使用できます。
class ConvImage
{
public:
bool ConvertImage(
CComPtr<IWICImagingFactory> imagingFactory,
const std::wstring& szSrcFile,
const std::wstring& szDestFile );
};
if(m_ImagingFactory)
{
// saving
ConvImage convImage;
convImage.SetLossless(false);
convImage.SetCompressionQuality(0.8f);
convImage.SetImageQuality(0.8f);
convImage.ConvertImage(
m_ImagingFactory,
L"D:\\Media\\lyf_39.jpg",
L"D:\\Media\\lyf_39.hdp" );
}
筆者が作成したクラスの働きを実際にお見せするため、2つのサンプルプロジェクトを用意しました。DateStampImageは、画像を開いて、画像の左上部に現在の日付とタイムスタンプを追加した後、任意の形式で保存できるプロジェクトです。一方ImageConvertorは、WICを用いて異なる画像形式に変換するための簡単なプロジェクトです。
