1

我试图让Gtk::Image小部件显示文件中的图片,但阻止小部件扩大大小,所以我从 a 加载它Gdk::Pixbuf然后缩放图片。我使用Gdk::Pixbuf而不是GdkPixBuf因为后者适用于常规指针,但Gtk::Image需要一个Glib::RefPtr<Gdk::Pixbuf>. (只是提到所有这些,以防有更好的方法来实现我不知道的我正在做的事情。)

auto pixbuf = Gdk::Pixbuf::create_from_file("/home/raitis/Music/WRLD/Awake EP/cover.jpg");
auto scaled = pixbuf->scale_simple(48, 48, Gdk::InterpType::NEAREST);
image->set(scaled);

无论如何,问题是虽然我正在关注文档Gdk::Pixbuf,但我的代码中的第 2 行会生成错误:

error: ‘NEAREST’ is not a member of ‘Gdk::InterpType’
auto scaled = pixbuf->scale_simple(48, 48, Gdk::InterpType::NEAREST);
                                                            ^~~~~~~

相反,尝试GDK_INTERP_NEAREST也会导致错误。:(

no known conversion for argument 3 from ‘GdkInterpType’ to ‘Gdk::InterpType’
4

1 回答 1

1

从稳定的gtkmm gdkmm 文档中,Gdk::InterpType成员是:

INTERP_NEAREST

最近邻抽样;这是最快和最低质量的模式。缩小时质量通常是不可接受的,但放大时可能还可以。

INTERP_TILES

这是对 PostScript 图像运算符的精确模拟,没有启用任何插值。

每个像素都被渲染为一个纯色的微小平行四边形,其边缘使用抗锯齿实现。它类似于最近邻放大,双线性缩小。

INTERP_BILINEAR

最佳质量/速度平衡;默认使用此模式。

双线性插值。对于放大,它相当于对理想的双线性插值图像进行点采样。为了减少,它相当于铺设小瓷砖并在覆盖区域上整合。

INTERP_HYPER

这是最慢和最高质量的重建功能。

它源自 Wolberg 的“Digital Image Warping”中的双曲线滤波器,并正式定义为对理想双曲线滤波器插值图像进行采样的双曲线滤波器(滤波器设计为对 1:1 像素映射具有幂等性)。

Gdk::Pixbuf的文档中,您将在该scale_simple方法中找到对插值类型的引用:

使 src 不受影响。如果您想要最大速度,interp_type 应该是Gdk::INTERP_NEAREST (但是当按比例缩小Gdk::INTERP_NEAREST通常很难使用)。默认的 interp_type 应该是 Gdk::INTERP_BILINEAR,它提供了合理的质量和速度。

于 2017-12-18T14:41:24.017 回答