2012-01-31 54 views
2

我使用Windows(均爲7 & XP - 兩個32位)和編碼在C++StretchBlt收縮腐敗

我接收來自外部源的位圖。這些位圖的分辨率是固定的(384x288)

我收到位圖後,需要根據可變大小的佈局調整它的大小,所以我正在使用StretchBlt來執行這些任務。

如果我將位圖大小調整爲更大的屏幕圖像,這個效果很好。

但是,如果我將傳入的位圖縮小爲放在屏幕上的較小版本,我會在圖像上出現一些奇怪的「裝箱」效果。

在以下示例中,三個面板中的每個面板的源圖像都是相同的。但左邊的兩個(調整小一點)都對他們有拳擊/線條效果。

enter image description here

對於實際StretchBlt電話,我這樣做:

 memcpy(at_TempPointer[PortNo], // Destination 
      (void *)VideoBufferAddress, // Source 
      FIXED_IMAGE_WIDTH * FIXED_IMAGE_HEIGHT * BYTES_PER_PIXEL // Number of bytes 
     ); 

    StretchBlt(at_ImageDC[PortNo], // HDC Dest 
       0, // X Origin Dest 
       0, // Y Origin Dest 
       at_Width[PortNo], // Width Dest 
       at_Height[PortNo], // Height Dest 
       at_GhDC[PortNo], // HDC Source 
       0, // X Origin Source 
       0, // Y Origin Source 
       FIXED_IMAGE_WIDTH, // Width Source 
       FIXED_IMAGE_HEIGHT, // Height Source 
       SRCCOPY // Graphic Operation 
       ); 

但我想知道,如果可能的問題是在其他地方。

有沒有其他人有過這種調整圖像腐敗的經驗,知道我可以如何修復它?

+0

是否做到這一點上你正在運行它所有的PC上?更改視頻卡類型是否解決了問題? – Skizz 2012-01-31 12:56:13

回答

7

您是否正在使用SetStretchBltMode來設置StretchBlt模式?

HALFTONE從源矩形

地圖像素到在 目標矩形的像素塊。 像素的目標塊上的平均顏色近似於源像素的顏色。

設置HALFTONE伸展模式後,應用程序必須調用 SetBrushOrgEx函數來設置畫筆原點。如果它沒有執行 ,刷子會發生錯位。

+0

就是這樣。非常感謝。 – Dave 2012-01-31 13:12:02

1

工作基於調色板的OnPaint中的代碼是兼容VS 2013:

void CMyView::paint_image(CDC* pDC) 
{ 

CPalette * pal = &m_Palette; 

    if (pal->m_hObject != NULL && m_Bitmap.m_hObject != NULL) 
    { 
     if (pDC != NULL) 
     { 
      CPalette *pOldPalette; 
      pOldPalette = pDC->SelectPalette(pal, FALSE); 
      pDC->RealizePalette(); 

      SetStretchBltMode(pDC->GetSafeHdc(), HALFTONE); 

      if(flip) 
       pDC->StretchBlt(0, 0, x*zoomx, y*zoomy, m_pMemDC, x, y, -x, -y, SRCCOPY); 
      else 
       pDC->StretchBlt(0, 0, x*zoomx, y*zoomy, m_pMemDC, 0, 0, x, y, SRCCOPY); 
      pDC->SelectPalette(pOldPalette, TRUE); 
     } 
     else 
     { 
      CClientDC m_pWinDC(this); 
      OnPrepareDC(&m_pWinDC); 
      m_pWinDC.SelectPalette(pal, FALSE); 
      m_pWinDC.RealizePalette(); 

      SetStretchBltMode(m_pWinDC, HALFTONE); 

      if(flip) 
       m_pWinDC.StretchBlt(0, 0, x*zoomx, y*zoomy, m_pMemDC, x, y, -x, -y, SRCCOPY); 
      else 
       m_pWinDC.StretchBlt(0, 0, x*zoomx, y*zoomy, m_pMemDC, 0, 0, x, y, SRCCOPY); 
     } 

     } 
    } 
+0

感謝行'SetStretchBltMode(pDC-> GetSafeHdc(),HALFTONE);',它讓我知道如何獲得HDC – 2014-11-11 01:28:12