2013-02-15 99 views
0

我有一個2752x2200位圖圖像。我只能在我的MFC對話框中顯示1/3(對於明顯的尺寸問題),所以如果我不縮放圖像,我只能得到左上方的917x733塊(左上1/3塊)。我想將圖像縮小3倍,以便將整個圖像放在1/3圖像大小的區域。我已經設置了灰度位圖如下所示:縮放位圖輸出扭曲圖像

////////////////////////////////////////////////////////////////////////// 
    ////////// Setup Bitmap //////////////////////////////////////////////// 
    ////////////////////////////////////////////////////////////////////////// 

    //// FILEHEADER //// 
    BITMAPFILEHEADER* bf = new BITMAPFILEHEADER; 
    bf->bfType = 0x4d42; 
    bf->bfSize = 6054400 + 54 + sizeof(BITMAPINFO); 
    bf->bfOffBits = 54; 

    //// INFOHEADER //// 
    BITMAPINFOHEADER* bi = new BITMAPINFOHEADER; 
    bi->biSize = 40; 
    bi->biWidth = 2752; 
    bi->biHeight = -2200; 
    bi->biPlanes = 1; 
    bi->biBitCount = 8; 
    bi->biCompression = 0; 
    //bi->biSizeImage = 6054400; //not required 
    bi->biXPelsPerMeter = 2835; 
    bi->biYPelsPerMeter = 2835; 
    bi->biClrUsed = 0; 
    bi->biClrImportant = 0; 

    //// INFO //// 
    BITMAPINFO* pbmi = (BITMAPINFO*)alloca(sizeof(BITMAPINFOHEADER) + 
     sizeof(RGBQUAD)*256); 
    pbmi->bmiHeader.biSize = sizeof (pbmi->bmiHeader); 
    pbmi->bmiHeader.biWidth = 2752; 
    pbmi->bmiHeader.biHeight = -2200; 
    pbmi->bmiHeader.biPlanes = 1; 
    pbmi->bmiHeader.biBitCount = 8; 
    pbmi->bmiHeader.biCompression = BI_RGB; 
    pbmi->bmiHeader.biSizeImage = 0; 
    pbmi->bmiHeader.biXPelsPerMeter = 14173; 
    pbmi->bmiHeader.biYPelsPerMeter = 14173; 
    pbmi->bmiHeader.biClrUsed = 0; 
    pbmi->bmiHeader.biClrImportant = 0; 
    //create grayscale color palette 
    for(int i=0; i<256; i++) 
    { 
     pbmi->bmiColors[i].rgbRed = i; 
     pbmi->bmiColors[i].rgbGreen = i; 
     pbmi->bmiColors[i].rgbBlue = i; 
     pbmi->bmiColors[i].rgbReserved = 0; 
    } 

    //// IMAGE DATA //// 
    pFrame->GetImage(m_imageData); 

    ////////////////////////////////////////////////////////////////////// 
    ////// Create image that's printed to dialog box ///////////////////// 
    ////////////////////////////////////////////////////////////////////// 
    HDC hdc = ::GetDC(NULL); 
    hbit = CreateDIBitmap(hdc, bi, CBM_INIT, m_imageData, 
     pbmi, DIB_RGB_COLORS); 

然後我繪製位圖到我的對話框是這樣的:

BITMAP* bi = new BITMAP; 
    CBitmap bmp; 
    bmp.Attach(hbit); 
    CClientDC dc(pWnd); 
    CDC bmDC; 
    bmDC.CreateCompatibleDC(&dc); 
    CBitmap *pOldbmp = bmDC.SelectObject(&bmp); 
    bmp.GetBitmap(bi); 
    dc.StretchBlt(384,21,bi->bmWidth,bi->bmHeight,&bmDC,0,0, 
     bi->bmWidth,bi->bmHeight,SRCCOPY); 
    bmDC.SelectObject(pOldbmp); 

圖像看起來很好,與此代碼,但它只是整個圖像的左上塊:

image1

在我試圖縮小圖片,我改了行:

 dc.StretchBlt(384,21,bi->bmWidth,bi->bmHeight,&bmDC,0,0, 
      bi->bmWidth,bi->bmHeight,SRCCOPY); 

到:

 dc.StretchBlt(384,21,bi->bmWidth/3,bi->bmHeight/3,&bmDC,0,0, 
      bi->bmWidth,bi->bmHeight,SRCCOPY); // 1/3 original size 

現在我的輸出看起來縮小,它的顯示(好)的整體形象,但一切看起來會有些失真(壞):

image2

(注圍繞圖像邊界的圓環。那些不應該在那裏,當你實際看到我的圖像流的實時視頻,他們脈動,基本上毀了圖像)。

我的問題是:什麼是造成這種失真,有什麼簡單的,我可以做些什麼來解決它?

編輯:嘗試的StretchDIBits()後:

StretchDIBits(dc.m_hDC, 384, 21, bi->bmWidth/3, bi->bmHeight/3, 0, 
      0,bi->bmWidth,bi->bmHeight, myObv->GetImageData(), 
      myObv->GetPBMI(), DIB_RGB_COLORS, SRCCOPY); 

我的輸出是這樣的:

i.imgur.com/DA49P8x.png

+0

是否有任何方法可以在某處張貼100%大小的屏幕截圖?我懷疑你看到圖像中固有的噪聲失真,但不能確定這裏顯示的已調整大小的圖像。 – 2013-02-15 17:50:11

+2

沒關係,我發現你可以在一個新標籤中打開圖片,並以100%的比例看到它。這個問題並沒有出現混淆現象,而是出現了混淆 - 調色板被縮減爲極少數的顏色。 – 2013-02-15 18:10:49

回答

3

如果您縮放位圖,那麼windows api可能在視覺上表現不佳,因爲它旨在優化性能。在StretchBlt之前添加以下行以增強位圖操作:

SetStretchBltMode(dc.m_hDC, HALFTONE); 
+1

您可能在這裏有一些東西,但是對於灰度調色板,我建議使用「COLORONCOLOR」。 – 2013-02-16 06:14:10

+0

@MarkRansom - 是的,我認爲你是對的,它更適合xcdemon05的用法,我只是從我的舊代碼中選擇這個。 – mfc 2013-02-16 10:24:32

+0

就是這樣! :) – xcdemon05 2013-02-18 13:10:44

2

而不是StretchBLT嘗試StretchDIBits

StretchDIBits(dc.m_hDC, 384, 21, bi->bmWidth/3, bi->bmHeight/3, 0, 0, 
       bi->bmWidth, bi->bmHeight, m_imageData, pbmi, DIB_RGB_COLORS, SRCCOPY); 
+0

@ xcdemon05,這很奇怪。我唯一能想到的其他事情是將'biClrUsed'和'biClrImportant'設置爲256,但我不指望改變任何內容。 – 2013-02-15 19:02:23

+0

@ xcdemon05我最近的想法是,你可能有調色板腐敗。嘗試在StretchDIBits之後測試調色板,以確保它仍然是灰度調色板。 – 2013-02-15 20:32:40