【发布时间】:2011-04-21 22:47:36
【问题描述】:
有谁知道自定义 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);
}
作为参考,我已将以下内容添加到过滤器的 - (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];
}
此外,我添加了以下方法来设置我在 - (id)init 方法中调用的 ROI:[filterKernel setROISelector:@selector(regionOf:destRect:userInfo:)];
- (CGRect) regionOf:(int)samplerIndex destRect:(CGRect)r userInfo:obj
{
return r;
}
对于这个问题的任何帮助或建议将不胜感激。我确信 CIFilters 可以处理更大的图像,因为我使用 CIBumpDistortion 处理超过 50 兆像素的图像,所以我一定做错了什么。有什么想法吗?
【问题讨论】:
标签: cocoa image-processing quartz-graphics core-image