Dav*_*ave 2 c++ windows resize image stretchblt
我正在使用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
);
Run Code Online (Sandbox Code Playgroud)
但我想知道问题是否可能在其他地方.
有没有其他人有这种调整图像损坏的经验,知道如何解决它?
你在StretchBlt使用设置模式SetStretchBltMode吗?
HALFTONE
将源矩形中的像素映射到目标矩形中的像素块.目标像素块上的平均颜色近似于源像素的颜色.
设置HALFTONE拉伸模式后,应用程序必须调用SetBrushOrgEx函数来设置画笔原点.如果不这样做,则会发生刷子错位.