Получение "JPEGDecompressSurface: сбой декодирования изображения": при создании UIImage из исходных данных JPG на iOS 10
Начиная с обновления до iOS 10, я получаю следующую ошибку при создании UIImage из NSMutableData:
JPEGDecompressSurface: сбой декодирования изображения: e000..... "
В результате не возникает странное или не нормальное поведение, но когда я отлаживаю приложение, я вижу ошибку при каждом создании образа.
Вот код, где я создаю изображение из загруженных данных с помощью GCDAsynchSocket
class:
NSData *imgDataToGen = [NSData dataWithData:imgBuffer];
UIImage *img = [[UIImage alloc] initWithData:imgDataToGen];
[_delegate client:self didReceiveImage:img];
Буфер imgBuffer
- это NSMutableData-Object
, который содержит данные загруженного изображения. Когда загрузка завершена, данные преобразуются в изображение и передаются в основной графический интерфейс, запуская пользовательский метод делегирования. В главном графическом интерфейсе изображение устанавливается на изображение.
После обработки изображения буфер очищается.
Я пробовал разные вещи, например, заставляя расшифровку UIImage уже в фоновом потоке, но всегда получаю ту же ошибку. Изображение отображается всегда в правильном направлении, поэтому я действительно не понимаю сообщение об ошибке.
Я пробовал iPhone 5c
с iOS 10.0.2
и на Simulator 5s
с помощью iOS 9.2
и 10.0.2
.
Вкл iPhone 5c
Я получаю ошибку, на симуляторе нет.
Как я могу исправить эту ошибку или игнорировать этот тип ошибок?
Ответы
Ответ 1
У меня была такая же проблема и решена.
В моем случае я не заметил, но преобразование из Data в UIImage и сохранение было выполнено в основном потоке, как только я отправил его async в глобальную очередь с приоритетом QOS фона и только обновление GUI UIImage, которое я отправил обратно в главную очередь, ошибка остановки отображается в отладчике.
Надеюсь, это поможет вам.
Пример:
fileprivate func downloadFromURL(urlString:String, callback:((_ image:UIImage?, _ error: Error?)->Void)?) {
var image: UIImage?
guard let url = URL(string: urlString) else {
callback!(nil, iError.RuntimeError(reason: "Wrong URL for image".localized))
return
}
DispatchQueue.global(qos: .background).async {
do {
let data = try Data(contentsOf: url)
image = UIImage(data: data)
DispatchQueue.main.async {
callback!(image,nil)
return
}
} catch {
print(error.localizedDescription)
callback!(nil, iError.RuntimeError(reason: "Data error for image".localized))
return
}
}
}