我有一个所有者绘制静态控件。
它应该在渐变背景之上有位图。
静态控件尺寸不固定,它们是在创建父窗口期间计算的。
我从资源文件中加载了背景颜色为RGB(255,163,94)的位图。
使用TransparentBlt( ... , RGB( 255, 163, 94 ) )
API我拉伸/缩小位图以适应静态控件客户区(位图是设备相关位图,而不是DIB,如果这很重要)。
位图图片具有150 DPI的水平和垂直分辨率,24色位深度,4395像素宽度和5613像素高度。
位图通过LoadBitmap( ... )
上的WM_CREATE
API加载。
原始图片如下,但我缩小了尺寸,所以我可以上传它:
问题在于图片的质量。
Bellow是我在绘制静态控件之后得到的结果:
像素化很明显。
宽高比也会丢失,因为我使用TransparentBlt()
。
浏览SO档案,我发现了类似的问题,但它们与Android有关。他们都没有帮助我。也许我的经验不足使我无法看到有用的信息。
根据这些问题的一个链接,我了解了图像缩放算法的存在。这是我想到的页面:http://en.wikipedia.org/wiki/Resampling_%28bitmap%29
我尝试使用较小的位图,但是图片模糊,即使我将 pixelation 解析到某个点。
似乎我的问题在于位图中的数据不足或太多,所以当我尝试"推送"大位图到小按钮,它只是不适合所以我得到像素化和锯齿效果,但如果我尝试将小位图放入大按钮,那么数据缺少会导致图像模糊。
浏览互联网后,我看到了建议,可以通过矢量图形和元文件解决这个问题。
由于我对此感到愚蠢,我会问几个问题。
如果主题很广泛,我会请求社区通过评论通知我,我会将其删除,并尝试对其进行重新调整以符合更好地发布问题的SO规则。 < / p>
这个问题确实对我来说意外发生,所以我不知道如何开始解决它,因为我对WIN32还不熟悉。
我必须承认我感到震惊,因为我预计TransparentBlt()
会为我做所有的工作。
如何解决这个问题,这样我可以保持画面的宽高比和质量?
我会考虑以下解决方案:
将某些GDI API调用组合到我现有的拉伸/收缩处理程序中,这样我就可以实现高质量并保留图片的宽高比,而无需过多地修改代码?
使用GDI +解决我的问题。到目前为止我还没有使用GDI +,但有一天必须开始,为什么不现在,如果这将解决我的问题呢?
如果矢量图形可以解决我的问题,我必须强迫社区给我以下的帮助:PURE WIN32中的矢量图形的书/教程/文档/文章/代码示例的任何建议将非常感谢,因为我自己还没找到。
如果我必须实施其中一种缩放算法,请推荐一些书籍/教程/链接/代码示例,因为我自己还没找到。
我无法使用库,这是对我的限制,但是,如果解决方案可以接受并且可以快速实施,我可以试试为了说服我的雇主放松他们的标准,所以可以使用图书馆。
如果我保留两者宽高比和图片质量的标准太多,我会选择图片质量。我总是可以发布一个关于宽高比的新问题,也许我会在同一时间找到解决方案。
这就是全部。感谢您的耐心和时间。
问候。
答案 0 :(得分:1)
由于目标尺寸小于图像的原始尺寸,因此GDI只会遗漏某些像素。这是有效的,但结果往往是质量差。为了更好地执行此操作,您需要启用消除锯齿功能。启用抗锯齿后,过多的像素不会被丢弃,而是与相邻像素一起合并(平均)。
在GDI中,您基本上必须致电
SetStretchBltMode (HALFTONE);
在调用StretchBlt / TransparentBlt以实现消除锯齿效果之前。
编辑:我想我记得TransparentBlt忽略了StretchBltMode。如果这是真的,那么你必须没有透明度。可能的解决方案:创建一个与原始图像一样大的内存DC,绘制背景,使用TransparentBlt在顶部渲染图像。稍后,使用StretchBlt将图像从mem DC绘制到屏幕。
答案 1 :(得分:0)
我已经“争斗”这个问题将近三个月了,经过所有研究后我必须承认, Mr.Passant 是正确的清晰图像,如上所述只会在缩放时失去质量
因此,我决定使用矢量图形。
也许我会使用Enhanced Windows Metafile
或尝试使用SVG
的某个库。
我在此感谢所有想要提供帮助的人。
最好的问候。