【问题标题】:StretchBlt Shrink CorruptionStretchBlt 收缩损坏
【发布时间】:2012-02-23 04:11:01
【问题描述】:

我使用的是 Windows(7 和 XP - 均为 32 位)并使用 C++ 进行编码

我从外部来源接收位图。这些位图具有固定的分辨率 (384x288)

收到位图后,我需要根据可变大小的布局调整它的大小,因此我目前正在使用 StretchBlt 来执行这些任务。

如果我将位图的大小调整为更大的屏幕图像,效果很好。

但是,如果我将传入的位图缩小到较小的版本以放置在屏幕上,则会在图像上出现一些奇怪的“装箱”类型效果。

在以下示例中,三个面板中的每一个的源图像都是相同的。但是左边两个(缩小尺寸)都对它们有装箱/线条效果。

对于实际的 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
               );

但我想知道问题是否出在其他地方。

有没有其他人遇到过这种调整大小的图像损坏的经验,知道如何修复它?

【问题讨论】:

  • 它是否在您运行它的所有 PC 上执行此操作?更改显卡类型可以解决问题吗?

标签: c++ windows winapi gdi stretchblt


【解决方案1】:

您是否使用SetStretchBltMode 设置StretchBlt 模式?

半色调

将源矩形中的像素映射到 目标矩形。目标块上的平均颜色 像素近似于源像素的颜色。

设置 HALFTONE 拉伸模式后,应用程序必须调用 SetBrushOrgEx 函数设置画笔原点。如果做不到 因此,会发生画笔错位。

【讨论】:

    【解决方案2】:

    与 VS 2013 兼容的基于调色板的工作 OnPaint 代码:

     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 );
            }   
    
          }
      }
    

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2015-02-22
      相关资源
      最近更新 更多