jjzjj

c++ - 在按钮背景上拉伸(stretch)/收缩时位图质量下降

coder 2024-02-25 原文

介绍和相关信息:

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

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

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

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

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

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

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

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

问题:

问题出在图片质量上。

Bellow是我在所有者绘制静态控件后得到的结果:

像素化很明显。

纵横比也丢失了,因为我使用 TransparentBlt()

我为解决这个问题所做的努力:

浏览 SO 文件,我发现了类似的问题,但它们与 Android 相关。他们都没有帮助我。也许我的经验不足使我无法看到有用的信息。

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

我曾尝试使用较小的位图,但即使我将像素化解决到了某个点,图片还是很模糊。

似乎我的问题在于位图中的数据不足或过多,因此当我尝试将大位图“插入”小按钮时,它无法适应,因此我会得到像素化和锯齿状效果,但是如果我尝试将小位图变成大按钮,然后数据丢失,导致图片模糊。

通过互联网浏览后,我看到了一些意见和建议,可以用 vector 图形和元文件来解决这个问题。

由于我对此感到傻眼,所以我会问几个问题。

如果主题很广泛,那么我会要求社区通过评论通知我,我将删除它并尝试重新措辞以更好地适应发布问题的 SO 规则。

问题:

这个问题真的出乎我的意料,所以我不知道如何开始解决它,因为我对 WIN32 还很陌生。

我必须承认我很震惊,因为我原以为 TransparentBlt() 会为我做所有的工作。

我该如何解决这个问题,才能保持画面的纵横比和质量?

我会考虑以下解决方案:

  • 将某些 GDI API 调用组合到我现有的处理程序中以进行拉伸(stretch)/收缩,这样我就可以获得高质量并保持图片的纵横比,而无需过多修改代码?
  • 使用 GDI+ 解决我的问题。到目前为止,我还没有使用 GDI+,但总有一天要开始,为什么不现在,如果那能解决我的问题?
  • 如果 vector 图形可以解决我的问题,我必须敦促社区为我提供以下帮助:任何关于 PURE WIN32 vector 图形的书籍/教程/文档/文章/代码示例的推荐将不胜感激,因为我自己还没有发现任何。
  • 如果我必须实现一种缩放算法,请推荐一些书籍/教程/链接/代码示例,因为我自己还没有找到任何。

  • 我不能使用库,这是强加给我的限制 ,但是,如果解决方案可以接受 并且可以快速实现 ,我可以尝试说服我的雇主放宽他们的标准,以便可以使用库。

    如果我保留 纵横比和图片质量的标准太多,那么我会选择 图片质量。我可以随时发布有关纵横比的新问题,同时也许我会自己找到解决方案。

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

    问候。

    最佳答案

    由于目标尺寸小于图像的原始尺寸,GDI 只是遗漏了某些像素。这是有效的,但结果通常很差。为了更好地做到这一点,您需要启用抗锯齿。启用抗锯齿后,过多的像素不仅会被丢弃,还会与相邻像素合并(平均)。

    在 GDI 中,您基本上必须调用

    SetStretchBltMode (HALFTONE);
    

    在调用 StretchBlt/TransparentBlt 以实现抗锯齿效果之前。

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

    关于c++ - 在按钮背景上拉伸(stretch)/收缩时位图质量下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875548/

    有关c++ - 在按钮背景上拉伸(stretch)/收缩时位图质量下降的更多相关文章

    1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    2. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

      所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

    3. ruby-on-rails - 使用 Rmagick 或 ImageMagick 在背景上放置标题 - 2

      我有一张背景图片,我想在其中添加一个文本框。我想弄清楚如何将标题放置在其顶部的正确位置。(我使用标题是因为我需要自动换行功能)。现在,我只能让文本显示在左上角,但我需要能够手动定位它的开始位置。require'RMagick'require'Pry'includeMagicktext="Loremipsumdolorsitamet"img=ImageList.new('template001.jpg')img 最佳答案 这是使用convert的ImageMagick命令行的答案。如果你想在Rmagick中使用这个方法,你必须自己移植

    4. ruby - 使用 `+=` 和 `send` 方法 - 2

      如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

    5. ruby - 如何计算 Liquid 中的变量 +1 - 2

      我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

    6. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

      我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

    7. arrays - Ruby 数组 += vs 推送 - 2

      我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

    8. += 的 Ruby 方法 - 2

      有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

    9. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

      出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

    10. ruby-on-rails - 如何从按钮或链接单击的 View 调用 Rails 方法 - 2

      基本上,我试图在用户单击链接(或按钮或某种类型的交互元素)时执行Rails方法。我试着把它放在View中:但这似乎没有用。它最终只是在用户甚至没有点击“添加”链接的情况下调用该函数。我也用link_to试过了,但也没用。我开始认为没有一种干净的方法可以做到这一点。无论如何,感谢您的帮助。附言。我在ApplicationController中定义了该方法,它是一个辅助方法。 最佳答案 View和Controller是相互独立的。为了使链接在Controller内执行函数调用,您需要对应用程序中的端点执行ajax调用。该路由应调用rub

    随机推荐