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

1 に答える 1

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();
于 2011-01-09T12:11:05.427 に答える