如何在Gtkmm中消除模糊像素?

3
当我绘制一张图片并放大时,GTKmm(或者我猜是Cairo)会混合像素以使图像更加平滑。我非常讨厌这种效果,因为它不利于调试。我想要看到清晰、锐利的像素和图像,想要看到漂亮的小方块。那么如何关闭这个“酷炫”的混合功能呢?
这是我绘制图像的方法。
Gdk::Cairo::set_source_pixbuf(cairoContext, tile->tileImage, tile->x, tile->y);
cairoContext->paint();

我也尝试了fill方法,看看有何不同。

Gdk::Cairo::set_source_pixbuf(cairoContext, tile->tileImage, tile->x, tile->y);
cairoContext->rectangle(tile->x, tile->y, tile->tileImage->get_width(), tile->tileImage->get_height());
cairoContext->fill();

这不是。

编辑: 这行不起作用:

cairoContext->set_antialias(Cairo::Antialias::ANTIALIAS_NONE);

1
当你说“放大很多”,可能是在对图像进行缩放。听起来你想使用最近邻插值,但实际上使用了其他形式的插值。你需要确定你正在使用哪个函数/库来进行缩放,然后阅读其文档以找出如何更改插值类型。 - John Lindgren
缩放是通过以下方式完成的: cairoContext->scale(this->scale, this->scale); - user1145922
缩放的文档如下:“通过将X和Y用户空间轴分别按sx和sy缩放,修改当前变换矩阵(CTM)。轴的缩放在用户空间的任何现有变换之后进行。”请指出谈论插值的部分。我好像错过了它。 - user1145922
https://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-filter-t - John Lindgren
缩放(至少是上采样)总是涉及某种类型的插值。在cairo领域中,似乎不同的插值类型被称为过滤器。查找cairo_filter_t的文档(链接在先前的评论中),或参考下面Uli的答案。 - John Lindgren
1个回答

3

您需要在模式上设置一个NEAREST滤镜。我不确定C++ API的操作步骤,但在C语言中,我会在调用set_source_pixbuf之后执行以下操作:

cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);

cairo_pattern_set_filter? - John Lindgren
你是对的。很抱歉我漏掉了“模式”这一部分。 - Uli Schlachter
谢谢。似乎没有这个函数的cairomm包装器,或者至少我找不到它。为了使用它,我不得不稍微改变一下:cairo_pattern_set_filter(cairo_get_source(cairoContext->cobj()), CAIRO_FILTER_NEAREST); - user1145922
当缩小比例时,这会降低性能。我必须在比例大于1时有条件地使用它。另外,我切换到了CAIRO_FILTER_FAST。 - user1145922

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接