Core Image 中的最近邻缩放

Nearest neighbour scaling in Core Image

我想使用最近邻缩放从最小尺寸的 CIImage 高效地创建放大的 CIImage。

假设我想创建任意分辨率的图像,例如这些 EBU 彩条:

在像 OpenGL 这样的框架中,我们可以存储一个 8x1 像素的小纹理并将其渲染为任意大小的四边形,只要我们使用最近邻缩放,生成的图像就会很清晰。

我们的 CIImage 选项似乎仅限于 .transformedBy(CAAffineTransform(scaleX:y:)).filteredBy(filterName: "CILanczosScaleTransform"),它们都使用平滑采样,这对于摄影图像来说是一个不错的选择,但会模糊线条艺术图像的边缘,例如这些彩条 - 我特别想要像素化效果。

因为我正在尝试利用 Core Image 后端中的 GPU 处理,所以我宁愿不向进程提供已经放大的位图图像(例如使用 CGImage

有没有办法告诉 Core Image 使用最近邻采样,或者编写一个自定义的 CIImage 子类来实现这个?

我认为你可以使用 samplingNearest() 来做到这一点:

let scaled = image.samplingNearest().transformedBy(…)