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(…)
我想使用最近邻缩放从最小尺寸的 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(…)