有没有人知道自定义CIFilters的图像大小限制是什么?当图像高达2百万像素时,我创建的滤镜表现如预期,但当图像更大时则产生非常奇怪的结果。我在我的可可应用程序和石英合成器中都进行了测试。我开发的滤镜是一种几何类型的扭曲滤镜,需要一个ROI和一个跨越整个输入图像的DOD(我认为)。我已经为重新映射全景图像创建了这个滤镜,所以我希望它能在非常大的(50-100兆像素)图像上工作。
作为一个简单的测试,考虑以下CIFilter(可以在Quartz Composer中使用),它只是将图像平移,使图像的左下角被平移到中心(我知道这可以用仿射变换来完成,但我需要在更复杂的滤镜中执行这样的操作)。当图像为2000x1000时,此滤镜按预期工作,但当输入图像为4000x2000像素时,则产生奇怪的结果。问题在于,要么平移未将角落精确地移动到中心,要么图像输出完全消失。我注意到在大型图像上使用更复杂的滤镜时会出现其他奇怪的问题,但我认为这个简单的滤镜说明了我的问题,并且可以在Quartz Composer中复制。
任何有关此问题的帮助或建议将不胜感激。我相信CIFilters可以处理更大的图像,因为我已经使用CIBumpDistortion处理了超过50兆像素的图像,所以我一定做错了什么。有什么想法吗?
作为一个简单的测试,考虑以下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);
}
为了参考,我已经在我的滤镜的- (CIImage *)outputImage
方法的Objective-C部分中添加了以下内容,以设置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];
}
此外,我添加了以下方法来设置ROI,我在我的- (id)init
方法中调用它:[filterKernel setROISelector:@selector(regionOf:destRect:userInfo:)];
- (CGRect) regionOf:(int)samplerIndex destRect:(CGRect)r userInfo:obj
{
return r;
}
任何有关此问题的帮助或建议将不胜感激。我相信CIFilters可以处理更大的图像,因为我已经使用CIBumpDistortion处理了超过50兆像素的图像,所以我一定做错了什么。有什么想法吗?