<Ошибка>: ImageIO: CGImageReadGetBytesAtOffset в UIImagePNGRepresentation

Единственная другая информация, которую я мог найти об этой ошибке, была здесь, которая не была полезна.

Я получаю следующую ошибку при попытке сохранить изображения. Кажется, это происходит только тогда, когда у меня есть несколько изображений (~6) одновременно. Это также кажется совершенно случайным относительно того, когда это происходит. Иногда все в порядке, иногда происходит сбой на 1 изображении, иногда на 3, а иногда приложение полностью вылетает в EXC_BAD_ACCESS ошибка.

Ошибка: ImageIO: CGImageReadGetBytesAtOffset: ^^^ ОШИБКА ^^^ CGImageSource создан с размером данных: 1144891 - только текущий размер: 1003855

Вот код, который сохраняет изображение:

- (void)saveWithImage:(UIImage *)anImage andFileName:(NSString *)aFileName {
    NSString *subDirectory = @"Images";
    NSString *fileName = [aFileName stringByAppendingString:@".png"];

    NSString *documentsPath = [[CMAStorageManager sharedManager] documentsSubDirectory:subDirectory].path;
    NSString *imagePath = [subDirectory stringByAppendingPathComponent:fileName];
    __block NSString *path = [documentsPath stringByAppendingPathComponent:fileName];
    __block NSData *data = UIImagePNGRepresentation(anImage);

    self.image = anImage;
    self.tableCellImage = anImage;
    self.galleryCellImage = anImage;
    self.imagePath = imagePath; // stored path has to be relative, not absolute (iOS8 changes UUID every run)

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        if (![data writeToFile:path atomically:YES])
            NSLog(@"Error saving image to path: %@", path);

        dispatch_async(dispatch_get_main_queue(), ^{

        });
    });
}

Я получаю эту ошибку, и в результате мои изображения не сохраняются (или сохраняется только половина из них), что полностью портит отображение пользовательского интерфейса и запускает любое последующее приложение. Я сузил это до UIImagePNGRepresentation вызов.

С другой стороны, этот код блокирует пользовательский интерфейс; Я думаю из-за UIImagePNGRepresentation вызов; однако насколько я знаю UIImagePNGRepresentation не является потокобезопасным, поэтому я не могу сделать это в фоновом режиме. Кто-нибудь знает способ обойти это?

Спасибо!

2 ответа

Решение

Если кто-то сталкивается с подобной проблемой, это то, что исправило это для меня.

Сохранение данных iPhone iOS, полученных из UIImageJPEGRepresentation(), завершается ошибкой второй раз: ImageIO: ошибка CGImageRead_mapData 'open'

и это решение, которое я использовал для сохранения UIImages в фоновом потоке:

Конвертировать UIImage в NSData без использования UIImagePngrepresentation или UIImageJpegRepresentation

Я получал эту ошибку, потому что API, который я вызывал, выбрасывал 500 и возвращал html страницу ошибки в файле tmp >> NSData, который я пытался преобразовать в PNG.

Вы можете проверить файл, который вы пытаетесь открыть, это изображение перед конверсией.

Если вы загружаете файл с помощью dowloadTask, убедитесь, что statusCode равен 200, прежде чем перемещать tmp > /Document/.png

вот мой ответ в других ТАК

Другие вопросы по тегам