我正在使用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
);
但我想知道问题是否可能在其他地方。
有没有其他人有过这种调整图片损坏的经验,知道如何修复它?
答案 0 :(得分:7)
您是否使用SetStretchBltMode
设置了StretchBlt
模式?
HALFTONE
将源矩形中的像素映射到像素中的像素块 目标矩形。目标块上的平均颜色 像素近似于源像素的颜色。
设置HALFTONE拉伸模式后,应用程序必须调用 SetBrushOrgEx函数用于设置画笔原点。如果没有做到 因此,刷子不对齐发生。
答案 1 :(得分:1)
使用与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 );
}
}
}