当scaleKey大于某个值时,Lanczos缩放不起作用

时间:2014-09-26 15:26:01

标签: ios ios7 uiimage cifilter lanczos

我有这段代码

CIImage * input_ciimage = [CIImage imageWithCGImage:self.CGImage];
CIImage * output_ciimage =
[[CIFilter filterWithName:@"CILanczosScaleTransform" keysAndValues:
                           kCIInputImageKey, input_ciimage,
                           kCIInputScaleKey, [NSNumber numberWithFloat:0.72], // [NSNumber numberWithFloat: 800.0 / self.size.width],
                           nil] outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef output_cgimage = [context createCGImage:output_ciimage 
    fromRect:[output_ciimage extent]];
UIImage *output_uiimage;
output_uiimage = [UIImage imageWithCGImage:output_cgimage 
    scale:1.0 orientation:self.imageOrientation];
CGImageRelease(output_cgimage);
return output_uiimage;

因此,当scaleKey大于某个值时,output_uiimage就是黑色图像。

在我的情况下,如果键的值为kCIInputScaleKey> @ 0.52然后结果是黑色图像。当我在90度旋转图像时,我得到相同的结果,但值是0.72(而不是0.52)。

库中的错误或代码中的错误?

如果需要,我有iPhone 4,iOS 7.1.2,xCode 6.0。

2 个答案:

答案 0 :(得分:1)

这就是Apple所说的:

  

此方案暴露了Core Image中的错误。当渲染需要具有大于GPU纹理限制(4096)的维度的中间缓冲区并且输入图像符合这些限制时,会发生错误。任何在宽度或高度接近GL纹理限制的输入图像上执行卷积(模糊,lanczos)的滤镜都会发生这种情况。
  注意:如果输入图像的某个尺寸增加到4097,则渲染成功。

     

使用CIAffineTransform替换CILanczosScaleTransform(较低质量)或使用CG调整图像大小可能是所提供示例代码的变通方法。

答案 1 :(得分:0)

我在Apple工程师的要求下更新了Bug报告。他们回答:

  

我们认为问题在于Core Image Lanczos过滤器   在某些下采样比例因子下发生。我们希望解决这个问题   在将来。

     

滤波器应该适用于功率为2的下采样(即   1 / 2,1 / 4,1 / 8)。因此,我们建议将您的缩减示例限制为   这些值然后使用AffineTransform进行放大或缩小   如果需要,可以进一步。

     

我们现在正在关闭此错误报告。