首页 文章

在按钮背景上拉伸/缩小时,位图会丢失质量

提问于
浏览
4

简介及相关信息:

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

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

静态控件尺寸 are not fixed ,它们是在创建父窗口期间计算的 .

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

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

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

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

原始图片如下,但我缩小了尺寸,所以我可以上传它:

enter image description here

问题:

问题在于图片的质量 .

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

enter image description here

像素化是显而易见的 .

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

我努力解决这个问题:

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

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

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

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

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

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

If the topic is broad then I ask the community to inform me of it through comments, and I will remove it and will try to rephrase it to fit the SO rules of posting questions better.

问题:

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

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

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

我会考虑以下解决方案:

  • 将某些GDI API调用组合到我现有的拉伸/缩小处理程序中,这样我就可以实现高质量并保留图像的宽高比,而无需过多地修改代码?

  • 使用GDI解决我的问题 . 到目前为止我还没有使用GDI,但有一天必须开始,为什么不现在,如果这将解决我的问题呢?

  • 如果矢量图形可以解决我的问题,我必须强迫社区给我以下的帮助:PURE WIN32中的矢量图形的书/教程/文档/文章/代码示例的任何建议将非常感谢,因为我自己没有找到了 .

  • 如果我必须实现其中一个缩放算法,请推荐一些书籍/教程/链接/代码示例,因为我自己还没有找到任何 .

但是,如果解决方案可以接受 and can be implemented fast ,我可以试着说服我的雇主放宽他们的标准,因此可以使用库 .

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

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

问候 .

2 回答

  • 1

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

    在GDI你基本上要打电话

    SetStretchBltMode (HALFTONE);
    

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

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

  • 0

    我有"battled"这个问题将近三个月,而且经过所有这些研究我必须承认,帕桑特先生是正确的清晰图像,如上所述只会在缩放时失去质量 .

    因此,我决定使用矢量图形 .

    也许我会使用 Enhanced Windows Metafile 或者尝试使用某些库来获取 SVG .

    我特此感谢所有想要帮助的人 .

    最好的祝福 .

相关问题