Objective-C (iOS),使用 CIFilter 调整图像大小会产生无效输出 (UIImage)
Objective-C (iOS), Image resizing using CIFilter produces invalid output (UIImage)
我正在尝试调整 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
初始化的,那么它自己的 CIImage
就是 nil
。
更安全的做法是:
CIImage *ciImage = [[CIImage alloc] initWithImage:inputImage];
此外,请确保图像已从您的数据中成功加载。
我正在尝试调整 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
初始化的,那么它自己的 CIImage
就是 nil
。
更安全的做法是:
CIImage *ciImage = [[CIImage alloc] initWithImage:inputImage];
此外,请确保图像已从您的数据中成功加载。