StretchBlt收缩腐败

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)

但我想知道问题是否可能在其他地方.

有没有其他人有这种调整图像损坏的经验,知道如何解决它?

Rom*_* R. 7

你在StretchBlt使用设置模式SetStretchBltMode吗?

HALFTONE

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

设置HALFTONE拉伸模式后,应用程序必须调用SetBrushOrgEx函数来设置画笔原点.如果不这样做,则会发生刷子错位.