Создание прогрессивной jpeg на iOS с ImageIO приводит к блочным результатам на устройстве

Я пытаюсь создать прогрессивную jpeg из объекта UIImage, это код i

NSMutableData *data = [NSMutableData data];

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent: @"Library/Caches/test.jpg"];

CFURLRef url = CFURLCreateWithString(NULL, (CFStringRef)[NSString stringWithFormat:@"file://%@", path], NULL);
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypeJPEG, 1, NULL);
CFRelease(url);

NSDictionary *jfifProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                (__bridge id)kCFBooleanTrue, kCGImagePropertyJFIFIsProgressive,
                                nil];

NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSNumber numberWithFloat:.7], kCGImageDestinationLossyCompressionQuality,
                            jfifProperties, kCGImagePropertyJFIFDictionary,
                            nil];

CGImageDestinationAddImage(destination, ((UIImage*)object).CGImage, (__bridge CFDictionaryRef)properties);
CGImageDestinationFinalize(destination);
CFRelease(destination);

Это отлично работает при работе в симуляторе, но, к сожалению, производит короткие/блочные результаты на устройстве:

chunky/blocky result.

Любые идеи о том, что происходит? я вернусь к использованию UIImageJPEGRepresentation в качестве крайней меры, мне действительно нужны прогрессивные JPEG.

Ответ 1

Хорошие новости: я просто протестировал это на iPhone 4, и изображение выглядит великолепно:

NSDictionary *jfifProperties = [NSDictionary dictionaryWithObjectsAndKeys:
@72, kCGImagePropertyJFIFXDensity,
@72, kCGImagePropertyJFIFYDensity,
@1, kCGImagePropertyJFIFDensityUnit,
nil];

(используя новый литерал-синтаксис).

Хорошая ссылка JFIF, для которой означают эти параметры плотности.

Ответ 2

На iOS-симуляторе это хорошо, как упоминалось вами.

Но вы тестировали на симуляторе IOS с Retina Display. Для этого выполните следующие действия: 1. Симулятор запуска 2. Перейдите в раздел "Оборудование" → "Устройство" 3. Выберите симулятор с дисплеем Retina и проверьте его снова.

Если у вас возникла проблема с симулятором сетчатки ios, вы получите улов.

Попробуйте использовать изображение с очень маленьким разрешением, а затем проверьте его на своем устройстве.

Есть несколько проблем, которые показывают изображение с очень высоким разрешением в UIImageView. Проверьте ссылку, указанную ниже: Изображение высокого разрешения в UIImageView