stretchdibits怎么用?详细步骤讲解,保姆级教程!

吉云

今天搞搞C++里的StretchDIBits这个东西,一开始真给我整懵,网上那些资料讲的,云里雾里的,看半天也没弄明白到底咋回事。不过还经过我一番折腾,总算摸清点门道,现在就来跟大家分享一下我的实践过程。

初识 StretchDIBits

我以为StretchDIBits就是个简单的显示图片的函数,就像平时咱们在网页上看图一样,直接把图片往屏幕上一放就完事。结果,我发现我想简单。这玩意儿涉及到什么DIB、矩形区域、像素颜色数据复制之类的,头都大。

stretchdibits怎么用?详细步骤讲解,保姆级教程!

后来我查一些资料,大概知道StretchDIBits的作用:它能把一张图(DIB、JPEG、PNG格式的都行)里的一部分,按照你指定的大小,画到另一个地方。如果目标区域比原图大,它就把图像拉伸;如果目标区域小,它就把图像压缩。

动手实践

知道大概原理,我就开始动手试。我先是找一张图片,然后写几行代码,想看看效果。

我记得我当时是这么写的:


stretchdibits怎么用?详细步骤讲解,保姆级教程!

// ... 省略一些代码 ...

StretchDIBits(hdc, 0, 0, 100, 100, 0, 0, 50, 50, ...);

// ... 省略一些代码 ...

我当时的想法是,把图片的左上角50x50像素的区域,放大到100x100像素显示出来。结果,运行出来的效果,要么是图片上下颠倒,要么是显示的颜色不对,反正就是各种问题。

stretchdibits怎么用?详细步骤讲解,保姆级教程!

踩坑与解决

遇到问题,那就只能继续查资料,找解决办法呗。然后我就发现,原来StretchDIBits这函数用起来还有这么多讲究:

  • 图像颠倒问题: 原来,用StretchDIBits显示图片,默认情况下可能会出现图像上下颠倒的情况。我找到一种解决办法,就是在设置参数的时候,把源矩形的高度设成负数,这样图像就能正过来。
  • 颜色显示问题: StretchDIBits函数在处理不同位数的位图时,参数设置还不一样。比如说,处理24位位图的时候,倒数第二个参数要用DIB_RGB_COLORS,处理16位位图的时候要用DIB_PAL_COLORS。那我用的8位位图怎么办?我又是一顿查,发现需要自己创建一个颜色表。

stretchdibits怎么用?详细步骤讲解,保姆级教程!

按照查到的方法,我修改代码,然后再次运行,这回终于显示正常!

最终实现

经过一番折腾,最终我算是把StretchDIBits这个函数给搞明白。虽然过程有点曲折,但最终实现想要的效果,还是挺有成就感的。我把能跑通的代码的关键部分分享给大家:



stretchdibits怎么用?详细步骤讲解,保姆级教程!

StretchDIBits(*(), 0, 0, IMGWIDTH, IMGHEIGHT, 0, IMGHEIGHT, IMGWIDTH, -IMGHEIGHT, m_lpImage, m_lpImgInfo,...);

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

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]