【发布时间】:2019-05-21 01:07:58
【问题描述】:
我有一个图像,或者 Pixelart,因为没有更好的词,尺寸非常小。它实际上只是这个大小的数字数组:new int[150][10]。我在这个数组上绘制线条和曲线,主要是黑色背景上的一种颜色。它旨在稍后控制 LED 灯条。所以现在我正在寻找一种方法来消除我绘制的线条、曲线和形状的锯齿。我只想输入我的数组,有点像这样:
int[][] antiAlias(int[][] image) {
int[][] result = new int[image.length][image[0].length];
// do magic here
return result;
}
我偶然发现了 Wu 的抗锯齿,但据我所知,它仅用于绘制线条。如果有人能给我提示我应该寻找什么样的算法,我将不胜感激。
我还了解到可以通过下采样来实现抗锯齿效果。因为我可以在具有更高分辨率的阵列中创建直线和曲线,这也是一种选择。但我不知道如何执行下采样,而且我在互联网上可以找到的所有关于它的东西总是适用于 Image- 对象并使用库,这当然是没有选择的,因为我没有使用实际的图像。
我想要一个像这样的下采样函数:
// scale should be power of 2 (I guess??)
int[][] downsample(int[][] image, int scale) {
int[][] result = new int[image.length / 2][image[0].length / 2];
// do magic here
if (scale > 2) return downsample(result, scale / 2);
return result;
}
再一次,如果有人对我可以研究什么样的算法有一个好主意,我将非常感激。
【问题讨论】:
-
我感觉你根本不想要抗锯齿。相反,您希望在已经光栅化的图像上进行缩放/调整大小(即上/下采样)方法,例如 bi-linear 和 bi-cubic 插值。您还可以提高样本模糊度并降低样本以使内容平滑一点...任何样本输入和想要的输出?
-
嗯,缩放是一种选择,但最终抗锯齿也是如此。目前,我以稍后要显示的大小创建数组。我可以轻松地将它创建得更大,然后按比例缩小。但是抗锯齿对我来说似乎更直接。输入是带有颜色的二维 int 数组(十六进制数):
int[][] lights = new int[150][10];类似这样。 -
只有当你通过矢量图形(光栅化)渲染你的东西时才能进行抗锯齿,因此像素艺术与 WU 和类似算法无关......因为 PixelArt 意味着光栅图像(不是矢量)这就是为什么缩放是方式
-
啊,好吧。我猜有道理。有什么好的资源可以推荐,我可以看看缩放算法?
-
只是谷歌 bi-linear 和 bi-cubic 过滤或插值非常简单,网上有很多关于它的东西。
标签: java algorithm pixel antialiasing downsampling