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

标签 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: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. ImageIO: JPEG Empty JPEG image (DNL not supported)


更新:

我不知道,上面的代码有什么问题(除了下面 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);

最佳答案

这一行是问题所在:

CIImage *ciImage = inputImage.CIImage

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

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

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

关于ios - Objective-C (iOS),使用 CIFilter 调整图像大小会产生无效输出 (UIImage),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42069020/

相关文章:

ios - 为什么初始化这个 swift 对象会产生 2 而不是 1 的 ARC?

ios - 按下播放按钮时,YouTube IFrame 播放器显示 'This Video is Unavailable'

ios - 我们应该从 self 调用类别方法吗

ios - 我的图像没有被裁剪

iphone - 将图像从 iPhone 中的 UIImage 保存到沙箱

ios - 复杂图像(气泡/图钉)和 [UIImage ressizedImageWithCapInsets :]

ios - Firebase Analytics - 禁用,从自动跟踪中排除一些屏幕。操作系统

ios - 当我在每个 ViewController 之间切换时,我的 ViewController 重叠

iphone - Objective-C Xcode : Tableview detailitem empty

objective-c - 应用程序在 iPad 3 上崩溃,但在 iPad 2 上没有 - 崩溃日志