【问题标题】:Objective-C (iOS), Image resizing using CIFilter produces invalid output (UIImage)Objective-C(iOS),使用 CIFilter 调整图像大小会产生无效输出(UIImage)
【发布时间】:2017-06-23 11:13:30
【问题描述】:

我正在尝试在 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);

【问题讨论】:

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


    【解决方案1】:

    这行是问题所在:

    CIImage *ciImage = inputImage.CIImage
    

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

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

    另外,请确保图片已从您的数据中成功加载。

    【讨论】:

    • 有点变化。它处理图像(错误仍然存​​在 - 没有 JPEG 部分),但图像是黑色或充满颜色噪声, outputImage.size.height 宽度变量是无意义的数字(大或负值)。还有什么问题吗?
    • @Jolinar 我的猜测是您的原始图像未正确加载。你检查inputImage的大小了吗?
    • 是的,如果不执行调整大小,原始图像具有真实的 WxH 并且处理正常(有一些颜色校正和 JPEG 导出)。
    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 2017-09-28
    • 2013-11-23
    • 2020-03-04
    • 2013-05-12
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多