【问题标题】:StretchBlt and filtering alpha channelsStretchBlt 和过滤 Alpha 通道
【发布时间】:2011-06-05 06:00:01
【问题描述】:

我正在使用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);

【问题讨论】:

  • 您标记了 GDI+,但您没有使用其出色的大小调整过滤器?耻辱。
  • Hans 已经告诉你你叫什么了,你现在可以进行网络搜索了。
  • 我在这里没有看到任何 GDI+,我怀疑输入了“gdi”,所以很有帮助地“建议”gdi+
  • 是的,看来我正在使用 ye olde GDI(或者根本没有使用)。 GDI+ 看起来更有用,所以我会切换到它。

标签: c++ winapi gdi+ stretchblt


【解决方案1】:

最终完全放弃了 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();

【讨论】:

    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2017-06-14
    • 2011-09-07
    相关资源
    最近更新 更多