【问题标题】:How to scale down pixbuf image without losing quality?如何在不损失质量的情况下缩小 pixbuf 图像?
【发布时间】:2013-07-03 17:42:38
【问题描述】:

我有一个 pixbuf 图像,我想使用 cairo 将它保存为 pdf。因为pixbuf太大了,我想按比例缩小。我使用scale_simple 方法。但是,缩放的结果变得模糊。下面是我截取的截图。真实图片在右边,左边是来自pdf的图片

你知道如何在不损失质量的情况下缩小 pixbuf 吗?下面只是我的示例代码。

from gi.repository import GdkPixbuf, Gdk
import cairo

class gui():
    def __init__(self):
        pix = GdkPixbuf.Pixbuf.new_from_file('tux2.png')
        pix = pix.scale_simple(pix.get_width() / 3, pix.get_height() / 3, GdkPixbuf.InterpType.HYPER)
        ps = cairo.PDFSurface('pix.pdf', 500, 500)
        cr = cairo.Context(ps)
        Gdk.cairo_set_source_pixbuf(cr, pix, 0, 0)
        cr.paint()

if __name__ == '__main__':
    gui()

【问题讨论】:

  • 当您缩小(位图)图像时,除非同时增加其 dpi,否则您总是会损失质量。没有办法解决这个问题。一张 200x200 的图像只有 300x300 图像的 4/9 的信息,而且你不能在不损失质量的情况下丢弃 55% 的信息。平均、模糊、抖动和其他技术是试图使损失不那么明显;它们都有明显的副作用,但不使用它们的副作用更明显。
  • 我相信问题完全在于增加 dpi,因为输出是 PDF,本质上是一种矢量格式。

标签: python cairo pixbuf


【解决方案1】:

您根本不应该缩放 pixbuf。

相反,您应该缩放对象(按原样 pixbuf)。

它看起来像这样:

cr.save()
cr.scale(scale_xy, scale_xy)
cr.xxx_place_image(...)
cr.restore()

【讨论】:

  • np。添加一个警告,假设您的用户转储了一个 80Kx80K 16-bits-per-channel rgba 图像,这将导致一个巨大的 pdf,在这种情况下,您可能需要预缩放光栅图像 :)
【解决方案2】:

如何使用 PDF 命令重新创建此特定图像?它是矢量格式,您可以在 svg 中设计类似的图像并将其导入。图像缩放是丢失实际颜色数据的致命过程,因为会发生近似。使用高级缩放算法,例如 Lanczos 过滤。

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 2021-10-13
    • 2016-02-04
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多