有谁知道自定义 CIFilter 的图像大小有什么限制?我创建了一个过滤器,当图像高达 2 兆像素时,它可以按预期执行,但当图像更大时,会产生非常奇怪的结果。我已经在我的可可应用程序和石英作曲家中测试了这一点。我开发的滤波器是一种几何类型的失真滤波器,(我认为)需要一个覆盖整个输入图像的 ROI 和 DOD。我创建了这个过滤器来重新映射全景图像,因此我希望它可以处理非常大(50-100 兆像素)的图像。
作为一个简单的测试,考虑以下 CIFilter(可以在 Quartz Composer 中使用),它简单地平移图像,以便图像的左下角平移到中心(我知道这可以通过仿射变换来完成,但我需要在更复杂的过滤器中执行这样的操作)。当图像为 2000x1000 时,此过滤器按预期工作,但当输入图像为 4000x2000 像素时,会产生奇怪的结果。问题是要么平移没有将角精确地移动到中心,要么图像输出完全消失。我注意到大图像上更复杂的过滤器存在其他奇怪的问题,但我认为这个简单的过滤器说明了我的问题,并且可以在 Quartz Composer 中复制。
kernel vec4 equidistantProjection(sampler src, __color color)
{
vec2 coordinate = samplerCoord(src);
vec2 result;
vec4 outputImage;
result.x = (coordinate.x - samplerSize(src).x / 2.0);
result.y = (coordinate.y - samplerSize(src).y / 2.0);
outputImage = unpremultiply(sample(src,result));
return premultiply(outputImage);
}
当使用工作坐标而不是采样器坐标时,会出现相同的奇怪行为,但在这种情况下,尺寸为 2000x1000 的图像会出现错误,但对于尺寸为 1000x500 的图像则工作正常
kernel vec4 equidistantProjection(sampler src, __color color, vec2 destinationDimensions)
{
vec2 coordinate = destCoord();
vec2 result;
vec4 outputImage;
result.x = (coordinate.x - destinationDimensions.x / 2.0);
result.y = (coordinate.y - destinationDimensions.y / 2.0);
outputImage = unpremultiply(sample(src,result));
outputImage = unpremultiply(sample(src,samplerTransform(src, result)));
return premultiply(outputImage);
}
作为参考,我已添加到过滤器的 Objective-C 部分- (CIImage *)outputImage
使用以下方法将 DOD 设置为整个输入图像。
- (CIImage *)outputImage
{
CISampler *src = [CISampler samplerWithImage: inputImage];
NSArray * outputExtent = [NSArray arrayWithObjects:
[NSNumber numberWithInt:0],
[NSNumber numberWithInt:0],
[NSNumber numberWithFloat:[inputImage extent].size.width],
[NSNumber numberWithFloat:[inputImage extent].size.height],nil];
return [self apply: filterKernel, src, inputColor, zoom, viewBounds, inputOrigin,
kCIApplyOptionDefinition, [src definition], kCIApplyOptionExtent, outputExtent, nil];
}
另外,我添加了以下方法来设置我在我的中调用的投资回报率- (id)init
方法与此:[filterKernel setROISelector:@selector(regionOf:destRect:userInfo:)];
- (CGRect) regionOf:(int)samplerIndex destRect:(CGRect)r userInfo:obj
{
return r;
}
对此问题的任何帮助或建议将不胜感激。我确信 CIFilters 可以处理更大的图像,因为我已经使用 CIBumpDistortion 处理大于 50 兆像素的图像,所以我一定做错了什么。有任何想法吗?