Objective-C(iOS),使用CIFilter调整图像大小会产生无效输出(UIImage)

时间:2017-02-06 13:29:10

标签: ios objective-c uiimage image-resizing cifilter

我正在尝试在Objective-C(iOS)中调整JPEG图像的大小。输入是JPG文件,输出应为UIImage

我有这段代码:

// Load image from a file
NSData *imageData = [NSData dataWithContentsOfFile:jpgFile];
UIImage *inputImage = [UIImage imageWithData:imageData];
CIImage *ciImage = inputImage.CIImage;

// Set Lanczos filter
CIFilter *scaleFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"];
[scaleFilter setValue:ciImage forKey:@"inputImage"];
[scaleFilter setValue:[NSNumber numberWithFloat:0.5] forKey:@"inputScale"];
[scaleFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputAspectRatio"];

// Get an output
CIImage *finalImage = [scaleFilter valueForKey:@"outputImage"];
UIImage *outputImage = [[UIImage alloc] initWithCIImage:finalImage];

但是输出图像无效(outputImage.size.height is 0),并且在其他处理中导致以下错误:

  

CGContextDrawImage:无效的上下文0x0。如果你想看到   回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量。 ImageIO:JPEG空JPEG图像(不支持DNL)

<小时/> 的更新

我不知道,上面的代码有什么问题(除了下面Sulthan提到的初始化 - 感谢他)。我在最后使用了以下代码(此代码可以正常工作):

CIImage *input_ciimage = [[CIImage alloc] initWithImage:inputImage];
CIImage *output_ciimage =
    [[CIFilter filterWithName:@"CILanczosScaleTransform" keysAndValues:
    kCIInputImageKey, input_ciimage,
    kCIInputScaleKey, [NSNumber numberWithFloat:0.5],
    nil] outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef output_cgimage = [context createCGImage:output_ciimage fromRect:[output_ciimage extent]];
UIImage *output_uiimage = [UIImage imageWithCGImage:output_cgimage];
CGImageRelease(output_cgimage);

1 个答案:

答案 0 :(得分:1)

这一行是问题所在:

CIImage *ciImage = inputImage.CIImage

如果图片未从CIImage初始化,那么它自己的CIImage就是nil。 更安全的方法是:

CIImage *ciImage = [[CIImage alloc] initWithImage:inputImage];

此外,请确保已从数据中成功加载图像。