【问题标题】:scaling a bitmap without losing quality在不损失质量的情况下缩放位图
【发布时间】:2013-08-14 12:04:55
【问题描述】:

我有一个小问题.. 我正在开发一个允许 Delphi Vcl 应用程序被皮肤化的 SkinEngine。为了这个目标,我开发了一种新的文件格式(mSkin)来托管我的皮肤数据。所以我的皮肤文件包含 2 个标题,第一个包含有关皮肤使用的颜色的一些信息,第二个包含使用的位图皮肤(位图类型是 Alpha 通道位图以支持透明度)。在我的控件中,我使用一个函数从位图(mSkin.Bitmap)中提取对象位图并将此位图绘制到我的控件上。问题是,当位图未成形时,我在缩放源位图时质量很差。对象位图的大小与控件大小成正比(当控件大小更改时 ==> 位图也发生了变化。)

我曾尝试阅读 vcl 样式来解决问题.. 但它似乎很难阅读。 有没有办法复制位图并保持质量?

【问题讨论】:

  • 你为什么不使用 VCL样式?
  • @Uli Gerhardt :这是为了教育目的。

标签: c++ delphi delphi-xe2


【解决方案1】:

如果您使用位图,您将无法在没有问题的情况下进行缩放。如果你想在哪里缩放,例如一像素边框保持一像素边框,那么您必须为您的图像使用基于矢量的格式。

【讨论】:

  • 我建议例如SVG format。对于Delphi,有几个libraries available。
  • 我相信我们可以使用位图文件,因为vcl样式使用的是位图文件格式。
  • @user1720557 您可以通过使用一些预缩放的位图来缓解位图缩放的一些问题,然后您不必进行太多缩放。
【解决方案2】:

您需要将其划分为 9 个不同的位图,例如 3x3 网格。然后你只缩放中间,其余的保持相同的大小但移动。 This link 适用于安卓系统,但原理相同。

这里是another link。这是针对flash的,但也说明了原理。

【讨论】:

  • 有用的技术,但在我的渐变经验中效果不佳
  • @mark 公平点,但是当我像这样使用它们时,需要将渐变拉得很远才能显示为问题。
  • 也许是 GDI+ (sourceforge.net/projects/igdiplus) 我对重新采样渐变图像的帮助
  • @Finlaybob 这是一个很好的技术,但是如果位图被遮盖,它就不起作用了。
【解决方案3】:

尝试使用resampling algorithm。

对于升级,我非常喜欢 B-Spline。

对于像您这样的简单内容,hqnx family 有时会产生良好的效果,并且渲染速度非常快(即使是实时渲染)。对于一些pascal源代码,you may take a look at this forum thread。

另见this more general question。

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 2019-12-13
    • 2014-09-13
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多