2012-01-31 53 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