如何摆脱 Gtkmm 中的模糊像素?

Posted

技术标签:

【中文标题】如何摆脱 Gtkmm 中的模糊像素?【英文标题】:How do I get rid of blury pixels in Gtkmm? 【发布时间】:2019-05-02 13:30:29 【问题描述】:

当我绘制图片并放大时,GTKmm(或我想是 Cairo)将像素混合在一起以制作出漂亮的平滑图像。我真的很讨厌那个。调试很糟糕。我想看到清晰的像素和清晰的图像。我想看看漂亮的小方块。那么如何关闭酷炫的 blendy 功能呢?

这是我绘制图像的方式。

Gdk::Cairo::set_source_pixbuf(cairoContext, tile->tileImage, tile->x, tile->y);
cairoContext->paint();

还尝试填充以查看是否有任何不同。

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);

【问题讨论】:

当您说“放大”时,大概是在以某种方式缩放图像。听起来您想使用最近邻插值,但正在使用其他形式的插值。您需要确定用于进行缩放的函数/库,然后阅读其文档以了解如何更改插值类型。 缩放是通过以下方式完成的:cairoContext->scale(this->scale, this->scale); scale 的文档是:“通过分别按 sx 和 sy 缩放 X 和 Y 用户空间轴来修改当前变换矩阵 (CTM)。轴的缩放发生在任何现有变换之后用户空间。”请指出讨论插值的部分。我好像错过了。 cairographics.org/manual/… 缩放(至少向上缩放)总是涉及某种类型的插值。在开罗的土地上,似乎不同的插值类型被称为过滤器。查看 cairo_filter_t 的文档(之前评论中的链接),或参考 Uli 下面的回答。 【参考方案1】:

您需要在模式上设置NEAREST 过滤器。我不确定这方面的 C++ API,但在 C 中我会执行以下操作(在调用 set_source_pixbuf 之后):

cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);

【讨论】:

cairo_pattern_set_filter? 你是对的。很抱歉错过了“模式”部分。 谢谢。这个函数似乎没有 cairomm 包装器,或者至少我找不到它。要使用它,我必须稍微改变一下:cairo_pattern_set_filter(cairo_get_source(cairoContext->cobj()), CAIRO_FILTER_NEAREST); 这会影响缩小时的性能。当规模大于一时,我将不得不有条件地使用它。另外,我切换到 CAIRO_FILTER_FAST。

以上是关于如何摆脱 Gtkmm 中的模糊像素?的主要内容,如果未能解决你的问题,请参考以下文章

在 Kivy 中,如何防止像素图像在放大时变得模糊?

OpenCV(二)掩码操作与平滑(均值,高斯模糊)

为啥 UIBarButtonItem 图像总是模糊/模糊/像素化

用MATLAB怎么让图像模糊处理

当 SVG 前面有一个不以像素为单位大小的元素时,IE 和 Edge 中的路径边缘模糊

移动端高清适配方案(解决图片模糊问题1px细线问题)