2013-10-08 38 views
1

我使用的StretchDIBits功能和位圖的顯示期間,我可以看到,它被顯示在兩種不同的方式,例如以下:MFC - 模糊/像素化BMP與的StretchDIBits

Blurry BMP Pixel BMP

我正在做的唯一事情就是每當我得到新數據時更新BMP緩衝區。

請在下面找到用於顯示位圖的相關代碼。

if (pBMPBuffer) 
{ 
    LPBITMAPINFO pBmpInfo; 
    pBmpInfo = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)]; 

    pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    pBmpInfo->bmiHeader.biWidth = m_iZSize; 
    pBmpInfo->bmiHeader.biHeight = m_iXSize; 
    pBmpInfo->bmiHeader.biPlanes = 1; 
    pBmpInfo->bmiHeader.biBitCount = 32; 
    pBmpInfo->bmiHeader.biCompression = BI_RGB; 
    pBmpInfo->bmiHeader.biSizeImage = m_iXSize * m_iZSize; 
    pBmpInfo->bmiHeader.biXPelsPerMeter = 0; 
    pBmpInfo->bmiHeader.biYPelsPerMeter = 0; 
    pBmpInfo->bmiHeader.biClrUsed = 0; 
    pBmpInfo->bmiHeader.biClrImportant = 0; 

    SetStretchBltMode(pDC->m_hDC, STRETCH_HALFTONE); 
    StretchDIBits(pDC->m_hDC, 
        rectBMP.left, 
        rectBMP.top, 
        rectBMP.Width(), 
        rectBMP.Height(), 
        0, 
        0, 
        m_iZSize, 
        m_iXSize, 
        pBMPBuffer, 
        pBmpInfo, 
        DIB_RGB_COLORS, 
        SRCCOPY); 

    delete[] pBmpInfo; 
} 

我想使位圖始終具有「模糊」的外觀。 在此先感謝。

+0

該文件指出,應始終使用'SetBrushOrgEx' SetStretchBltMode'後',你有沒有嘗試過? –

+0

嗨馬克,我剛剛嘗試過,它現在顯示「僅」像素類型。你有什麼想法我怎麼能得到「模糊」的? – Toyo

+0

對不起,如果我這樣做,我會回答這個問題。我可以建議的唯一的事情是改變'SetBrushOrgEx'的參數。 –

回答

1

您可以使用GDI +而不是GDI並選擇在圖像縮放或旋轉時使用的雙三次插值算法。 See Gdiplus::Graphics::SetInterpolationMode

注意,GDI +將是比GDI慢..另一種選擇是使用OpenGL例如...

+0

這是行得通的。我使用Graphics的DrawImage方法來顯示位圖。謝謝。 – Toyo