C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 在按钮背景上拉伸/缩小时,位图会丢失质量大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
介绍及相关资料:

我有一个所有者绘制静态控件.

它应该在渐变背景之上有位图.

静态控件尺寸不固定,它们是在创建父窗口期间计算的.

我从资源文件加载RGB背景颜色(255,163,94)的位图.

使用TransparentBlt(…,RGB(255,94))API我拉伸/缩小位图以适应静态控件客户区(位图是设备相关位图,而不是DIB,如果这很重要).

位图图片具有水平和垂直分辨率150 DPI,24色位深度,宽度4395像素和高度5613像素.

位图通过WM_CREATE上的LoadBitmap(…)API加载.

原始图片如下,但我缩小了尺寸,@R_656_9447@上传它:

问题:

问题在于图片的质量.

Bellow是我在业主绘制静态控件后得到的结果:

像素化是显而易见的.

由于我使用TransparentBlt(),因此宽高比也会丢失.

我努力解决这个问题:

浏览SO档案,我发现了类似的问题,但它们与Android有关.他们都没有帮助我.也许我的经验不足阻止我看到有用的信息.

根据这些问题的一个链接,我了解了图像缩放算法的存在.这是我想到的页面http://en.wikipedia.org/wiki/Resampling_%28bitmap%29

我试图使用较小的位图,但是图像模糊,即使我将像素化解析到某个点.

似乎我的问题在于位图中的数据不足或者很多,所以当我尝试将大位图“推”到小按钮时,它只是不适合所以我得到像素化和锯齿状效果,但如果我试图把将小位图转换为大按钮,然后数据丢失,导致图像模糊.

浏览完Internet后,我看到了建议和建议,可以通过矢量图形和元文件解决这个问题.

既然我对此感到愚蠢,我会问几个问题.

如果主题很广泛,那么我要求社区通过评论通知我,我将删除它并将尝试对其进行重新调整以符合更好地发布问题的SO规则.

问题:

这个问题真的让我意外发生,所以我不知道如何开始解决它,因为我对WIN32还不太新.

我必须承认我感到震惊,因为我已经预料到TransparentBlt()会为我做所有工作.

如何解决这个问题,这样我可以保持画面的宽高比和质量?

我会虑以下解决方案:

>将某些GDI API调用组合到我现有的拉伸/收缩处理程序中,这样我就可以实现高质量并保留图像的宽高比,而无需过多地修改代码
>使用GDI解决我的问题.到目前为止我还没有使用GDI,但有一天必须开始,为什么不现在,如果这将解决我的问题呢?
>如果矢量图形可以解决我的问题,我必须强迫社区给我以下的帮助:在PURE WIN32中对Vector Graphics的书/教程/文档/文章/代码示例的任何建议将非常感谢,因为我自己没有找到了.
>如果我必须实现其中一个缩放算法,请推荐一些书籍/教程/链接/代码示例,因为我自己还没有找到任何.

我不能使用库,这是对我的限制,但是,如果解决方案是可以接受的并且可以快速实施,我可以试图说服我的雇主放宽他们的标准,因此可以使用库.

如果我保持图片宽高比和质量的标准太多,我会选择图片的质量.我总是可以发布一个关于宽高比的新问题,也许我会同时找到一个解决方案.

这就是全部.感谢您的耐心和时间.

问候.

解决方法

由于目标大小小于图像的原始大小,因此GDI只会省略某些像素.这是有效的,但结果往往是质量差.为了更好地执行此操作,您需要启用消除锯齿功能.启用抗锯齿后,过多的像素不会被丢弃,而是与相邻像素一起合并(平均).

在GDI你基本上要打电话

SetStretchBltMode (HALFTONE);

调用StretchBlt / TransparentBlt以实现消除锯齿效果之前.

编辑:我想我记得TransparentBlt忽略了StretchBltMode.如果这是真的,那么你必须没有透明度.可能的解决方案:创建一个与原始图像一样大的内存DC,绘制背景,使用TransparentBlt在顶部渲染图像.稍后,使用StretchBlt将图像从mem DC绘制到屏幕.

大佬总结

以上是大佬教程为你收集整理的c – 在按钮背景上拉伸/缩小时,位图会丢失质量全部内容,希望文章能够帮你解决c – 在按钮背景上拉伸/缩小时,位图会丢失质量所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。