SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

HD Photo形式対応の画像圧縮・展開ライブラリ
「Windows Imaging Component」

WICとGDI+を使って画像を編集

コードの使用

 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();

画像の変換

 異なる画像形式に変換するときは、LoadHdPhotosSaveHdPhotosを使用しないでください。これらのクラスは、画像を変換する方法としてはきわめて回りくどく非効率な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を用いて異なる画像形式に変換するための簡単なプロジェクトです。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Wong Shao Voon(Wong Shao Voon)

 現在、3D画像を専門とする会社でソフトウェア開発者として勤務。多くのシンガポール人と同様、趣味は読書、カラオケ、アニメや映画鑑賞、ゲーム、ジョギングなど。前々から書きたいアイディアをいくつか温めており、CodeGuruに記事を書く時間がもっと欲しいと思っている。記事では、常にコードの裏にある仕組み...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4056 2009/07/09 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー