You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Metal Shader中CIKernel的图像裁剪异常问题求助

胶片画框效果Metal Shader裁剪异常问题

我正在开发一个实现胶片画框效果的Metal Shader,代码如下:

extern "C" {
    namespace coreimage {
        float4 reassemble(sampler source, sampler frame, float imgWidth, float perFrameSize, float epsilon, destination dest) {
            float2 coord = dest.coord();
            float4 srcExtent = source.extent();
            float4 pixel = float4(0, 1, 0, 1);
            
            float sideFrameSize = epsilon + (imgWidth - srcExtent.z)/2 - perFrameSize;
            float offset = sideFrameSize + perFrameSize - epsilon;
            if (coord.x < sideFrameSize) {
                pixel = source.sample(source.transform(float2(coord.x + srcExtent.x + srcExtent.z - sideFrameSize, coord.y)));
            }
            else if (coord.x >= offset && coord.x <= srcExtent.z + offset) {
                pixel = source.sample(source.transform(float2(coord.x + srcExtent.x - offset, coord.y)));
            }
            else if (coord.x >= srcExtent.z + offset + perFrameSize - epsilon) {
                pixel = source.sample(source.transform(float2(coord.x + srcExtent.x - srcExtent.z - offset - perFrameSize + epsilon, coord.y)));
            }
            
            float4 framePixel = frame.sample(frame.transform(coord));
            return mix(pixel, framePixel, framePixel.a);
        }
    }
}

该Shader运行正常,能生成目标胶片画框效果。但在集成裁剪步骤到处理管线时出现异常:

  • 在调用Kernel函数前对源图像裁剪,结果正常;
  • 对Kernel输出的图像执行裁剪时,实际是源图像先被裁剪,再执行Shader处理,导致效果异常。

相关Swift调用代码如下:

if let source = self.kernel.apply(extent: frameImage.extent,
                                  roiCallback: { _, rect -> CGRect in
                                        return rect
                                    },
                                  arguments: [scaled.transformed(by: .init(translationX: 0, y: perFrameWidth - vOffset)), frameImage, image.extent.width, perFrameWidth, hOffset]) {
                    return source.cropped(to: frameImage.extent.insetBy(dx: 80, dy: 200))
                }

参考图像说明

  • 原始图像:未经过任何处理的输入图
  • 正常效果:Shader输出的未裁剪胶片画框效果
  • 异常效果:对Shader输出裁剪后得到的错误结果,源图像被提前裁剪导致画框效果错位

我没有直接裁剪传入Shader的源图像,仅对Shader输出执行裁剪,但源图像却被提前裁剪。需要修改逻辑,确保裁剪仅作用于Shader的输出图像,而非源图像,求解决方案。

内容的提问来源于stack exchange,提问作者Oleksandr Fedko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:22:37