我使用Windows(包括7&XP – 都是32位)和C ++编码
我正在接收来自外部源的位图。 这些位图的分辨率是固定的(384×288)
收到位图后,我需要根据可变大小的布局resize,所以我正在使用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 );
但是我想知道这个问题是否在其他地方。
有没有其他人有这种调整图像腐败的经验,知道我可以修复它?
你使用SetStretchBltMode
设置StretchBlt
模式吗?
HALFTONE
将源矩形中的像素映射到目标矩形中的像素块。 目标像素块上的平均颜色接近源像素的颜色。
在设置HALFTONE拉伸模式后,应用程序必须调用SetBrushOrgEx函数来设置画笔原点。 如果不这样做,会发生刷子错位。
与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 ); } } }