2011-01-07 3 views
3

Я масштабирую изображение с помощью StretchBlt().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

Бросил полностью на ВВД в конце концов. Оказывается, что правильный способ сделать это, курс, с 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();