2011-01-07 18 views
3

StretchBlt()で画像を縮小しています。ストレッチブロックとアルファチャンネルのフィルタリング

http://img684.imageshack.us/img684/2152/stretchblt.png

あなたが見ることができるように、私は品質のフィルタリングと透明性の間で選択する必要がありように、それが現在に見えます。両方を得る方法はありますか?これは私が実行する必要がある唯一の画像操作ですので、私は余分なライブラリを避けることを好むでしょう。

マイコード:

HDC srcDC = CreateCompatibleDC(NULL); 
SelectObject(srcDC, *phbmp); 

HDC destDC = CreateCompatibleDC(srcDC); 
HBITMAP NewBMP = CreateCompatibleBitmap(srcDC,NewWidth,NewHeight); 
SelectObject(destDC,NewBMP); 

SetStretchBltMode(destDC,HALFTONE); 
SetBrushOrgEx(destDC,0,0,NULL); 
if (StretchBlt(destDC,0,0,NewWidth,NewHeight,srcDC,0,0,width,height,SRCCOPY) == TRUE) 
{   
    DeleteObject(*phbmp); 
    *phbmp = NewBMP;     
    hr = S_OK; 
} 
else 
    DeleteObject(NewBMP); 
DeleteDC(srcDC); 
DeleteDC(destDC); 
+2

GDI +にタグを付けましたが、優れたサイズ変更フィルタは使用していませんか?恥。 –

+0

そして彼らは? – Artfunkel

+0

ハンスがあなたの名前をあなたに教えてくれました。あなたは今、ウェブ検索を行うことができます。 –

答えて

2

が最後にGDIに完全にあきらめました。これを行う正しい方法は、コースIWICImagingFactoryです。最終コード:

IWICImagingFactory *pImgFac; 
hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pImgFac)); 

IWICBitmap* NewBmp; 
hr = pImgFac->CreateBitmapFromHBITMAP(*phbmp,0,WICBitmapUseAlpha,&NewBmp); 

BITMAPINFO bmi = {}; 
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); 
bmi.bmiHeader.biWidth = NewWidth; 
bmi.bmiHeader.biHeight = -NewHeight; 
bmi.bmiHeader.biPlanes = 1; 
bmi.bmiHeader.biBitCount = 32; 
bmi.bmiHeader.biCompression = BI_RGB; 

BYTE *pBits; 
HBITMAP hbmp = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void**)&pBits, NULL, 0); 
hr = hbmp ? S_OK : E_OUTOFMEMORY; 
if (SUCCEEDED(hr)) 
{    
    IWICBitmapScaler* pIScaler; 
    hr = pImgFac->CreateBitmapScaler(&pIScaler); 
    hr = pIScaler->Initialize(NewBmp,NewWidth,NewHeight,WICBitmapInterpolationModeFant); 

    WICRect rect = {0, 0, NewWidth, NewHeight}; 
    hr = pIScaler->CopyPixels(&rect, NewWidth * 4, NewWidth * NewHeight * 4, pBits); 

    if (SUCCEEDED(hr)) 
     *phbmp = hbmp; 
    else 
     DeleteObject(hbmp); 

    pIScaler->Release(); 
} 
NewBmp->Release(); 
pImgFac->Release(); 
関連する問題