2017-02-06 4 views
2

Я пытаюсь изменить размер изображения JPEG в Objective-C (iOS). Входным файлом является JPG, а выход должен быть UIImage.Objective-C (iOS), изменение размера изображения с использованием CIFilter создает недопустимый вывод (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)


Update:

Я не знаю, что случилось с выше код (за исключением инициализации упомянутой 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

Эта линия проблема:

CIImage *ciImage = inputImage.CIImage 

Если изображение не инициализируется из CIImage то собственный CIImage является nil. Более безопасный подход:

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

Кроме того, убедитесь, что изображение было успешно загружено из ваших данных.

+0

Немного изменилось. он обрабатывает изображение (ошибка все еще присутствует - без части JPEG), но изображение черное или заполнено цветовым шумом, outputImage.size.height - переменные ширины - это числа бессмысленности (большие или отрицательные значения). Что-нибудь еще, что может быть не так с этим? – Jolinar

+0

@Jolinar Я предполагаю, что исходное изображение загружено неправильно. Вы проверили размер 'inputImage'? – Sulthan

+0

Да, исходное изображение имеет реальный WxH и обрабатывается нормально (есть некоторая цветовая коррекция и экспорт JPEG), если размер не выполняется. – Jolinar

Смежные вопросы