2016-03-28 12 views
0

私はサードパーティのライブラリから提供されているHBITMAPを持っており、JPEGとしてディスク上に再スケールする必要があります。Windows Imaging Component - HBITMAPからエンコーダを取得するには?

私はWICを使用したことがないので、私はこのチュートリアルを追ってきた:https://msdn.microsoft.com/en-us/library/windows/desktop/ff973956.aspx

私は私のHBITMAPからWicBitmapを作成しました。

リスト9では、デコーダが必要であることが明らかになりましたが、これを作成する唯一の方法はIWICImagingFactory :: CreateDecoderFromFilenameです。 IStreamを受け取るInitializeメソッドがありますが、それを使う正しい方法がわかりません。

これは、HBITMAPをディスクに保存する正しい方法ですか?もしそうなら、私はHBITMAPまたはWicBitmapからどのようにデコーダを入手できますか?

+2

いいえ、HBITMAPはすでにデコードされています。 JPEGファイルを書きたい場合は、* encoder *が必要です。 –

答えて

0

IWICImagingFactory::CreateBitmapFromHBITMAPインポートGDIビットマップをWICにデコードし、すでにデコーダが不要です。つまり、エンコーディングの部分に行ってディスクに保存するとよいでしょう。

以下のコードスニペットは、完全に完了します。デスクトップの左上隅の800x600ビットマップをHBITMAPとし、JPEGファイルに保存します。

#include "stdafx.h" 
#include <wincodecsdk.h> 
#include <atlbase.h> 

#define __C ATLENSURE_SUCCEEDED 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CoInitialize(NULL); 
    { 
     HBITMAP hBitmap; 
     { 
      HDC hDc = GetDC(NULL); 
      hBitmap = CreateCompatibleBitmap(hDc, 800, 600); 
      HDC hBitmapDc = CreateCompatibleDC(hDc); 
      HGDIOBJ hPreviousBitmap = SelectObject(hBitmapDc, hBitmap); 
      BitBlt(hBitmapDc, 0, 0, 800, 600, hDc, 0, 0, SRCCOPY); 
      SelectObject(hBitmapDc, hPreviousBitmap); 
      DeleteDC(hBitmapDc); 
      ReleaseDC(NULL, hDc); 
     } 
     CComPtr<IWICImagingFactory> pFactory; 
     __C(pFactory.CoCreateInstance(CLSID_WICImagingFactory)); 
     CComPtr<IWICBitmap> pBitmap; 
     __C(pFactory->CreateBitmapFromHBITMAP(hBitmap, NULL, WICBitmapIgnoreAlpha, &pBitmap)); 
     CComPtr<IWICBitmapEncoder> pBitmapEncoder; 
     __C(pFactory->CreateEncoder(GUID_ContainerFormatJpeg, NULL, &pBitmapEncoder)); 
     CComPtr<IWICStream> pFileStream; 
     __C(pFactory->CreateStream(&pFileStream)); 
     __C(pFileStream->InitializeFromFilename(L"D:\\Output.jpg", GENERIC_WRITE)); 
     __C(pBitmapEncoder->Initialize(pFileStream, WICBitmapEncoderNoCache)); 
     CComPtr<IWICBitmapFrameEncode> pBitmapFrameEncode; 
     CComPtr<IPropertyBag2> pPropertyBag; 
     __C(pBitmapEncoder->CreateNewFrame(&pBitmapFrameEncode, &pPropertyBag)); 
     PROPBAG2 Property; 
     ZeroMemory(&Property, sizeof Property); 
     Property.pstrName = L"ImageQuality"; 
     CComVariant vQuality(0.85f); 
     __C(pPropertyBag->Write(1, &Property, &vQuality)); 
     __C(pBitmapFrameEncode->Initialize(pPropertyBag)); 
     __C(pBitmapFrameEncode->WriteSource(pBitmap, NULL)); 
     __C(pBitmapFrameEncode->Commit()); 
     __C(pBitmapEncoder->Commit()); 
    } 
    CoUninitialize(); 
    return 0; 
} 
+0

ありがとう! IWICFormatConverterがIWICSourceBitmapから継承しているのが分かりませんでしたが、その後、私が必要とすることは簡単ではありませんでした。あなたの例は完璧に機能しました。 – Guest

関連する問題