今天搞搞C++里的StretchDIBits
这个东西,一开始真给我整懵,网上那些资料讲的,云里雾里的,看半天也没弄明白到底咋回事。不过还经过我一番折腾,总算摸清点门道,现在就来跟大家分享一下我的实践过程。
初识 StretchDIBits
我以为StretchDIBits
就是个简单的显示图片的函数,就像平时咱们在网页上看图一样,直接把图片往屏幕上一放就完事。结果,我发现我想简单。这玩意儿涉及到什么DIB、矩形区域、像素颜色数据复制之类的,头都大。
后来我查一些资料,大概知道StretchDIBits
的作用:它能把一张图(DIB、JPEG、PNG格式的都行)里的一部分,按照你指定的大小,画到另一个地方。如果目标区域比原图大,它就把图像拉伸;如果目标区域小,它就把图像压缩。
动手实践
知道大概原理,我就开始动手试。我先是找一张图片,然后写几行代码,想看看效果。
我记得我当时是这么写的:

// ... 省略一些代码 ...
StretchDIBits(hdc, 0, 0, 100, 100, 0, 0, 50, 50, ...);
// ... 省略一些代码 ...
我当时的想法是,把图片的左上角50x50像素的区域,放大到100x100像素显示出来。结果,运行出来的效果,要么是图片上下颠倒,要么是显示的颜色不对,反正就是各种问题。
踩坑与解决
遇到问题,那就只能继续查资料,找解决办法呗。然后我就发现,原来StretchDIBits
这函数用起来还有这么多讲究:
- 图像颠倒问题: 原来,用
StretchDIBits
显示图片,默认情况下可能会出现图像上下颠倒的情况。我找到一种解决办法,就是在设置参数的时候,把源矩形的高度设成负数,这样图像就能正过来。 - 颜色显示问题:
StretchDIBits
函数在处理不同位数的位图时,参数设置还不一样。比如说,处理24位位图的时候,倒数第二个参数要用DIB_RGB_COLORS
,处理16位位图的时候要用DIB_PAL_COLORS
。那我用的8位位图怎么办?我又是一顿查,发现需要自己创建一个颜色表。
按照查到的方法,我修改代码,然后再次运行,这回终于显示正常!
最终实现
经过一番折腾,最终我算是把StretchDIBits
这个函数给搞明白。虽然过程有点曲折,但最终实现想要的效果,还是挺有成就感的。我把能跑通的代码的关键部分分享给大家:

StretchDIBits(*(), 0, 0, IMGWIDTH, IMGHEIGHT, 0, IMGHEIGHT, IMGWIDTH, -IMGHEIGHT, m_lpImage, m_lpImgInfo,...);
StretchDIBits
这个函数还是挺强大的,可以实现图像的缩放、裁剪等功能。虽然用起来有点麻烦,但只要掌握它的用法,还是能做出很多有趣的效果的。这回的实践经历也让我明白,学习新东西,遇到问题不要怕,多查资料,多动手尝试,总能找到解决办法的。