Сбой iOS 8.1 (EXC_BAD_ACCESS): <Ошибка>: ImageIO: CGImageReadGetBytesAtOffset: *** ОШИБКА *** CGImageSource был создан с размером данных:
Благодарим за любую помощь в устранении сбоя (EXC_BAD_ACCESS) в моем приложении для iOS. Я вижу это с момента обновления моего приложения до iOS 8 с использованием последней доступной iOS 8.1.2. Тот же код отлично работал в iOS 7.x.
Одним из представлений в моем приложении является UICollectionView
, В каждой ячейке представления коллекции отображается изображение, которое отображается динамически и меняется через каждые несколько минут по мере появления нового содержимого.
В левом верхнем углу ячейки также отображается текстовая метка / заголовок для этой ячейки представления коллекции. Чтобы обеспечить читаемость текстовой метки в зависимости от цвета изображения ячейки, у меня есть некоторый код (см. Ниже) для определения цвета изображения в левом верхнем углу ячейки. Основываясь на этом цвете, я использую белый или черный цвет для текстовой метки / заголовка ячейки (отображается в верхней части изображения в ячейке).
Ниже приведен фрагмент кода. Довольно часто я получаю сбой EXC_BAD_ACCESS в следующей строке кода:
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), imageRef);
Журналы ошибок показаны в Xcode...
: ImageIO: CGImageReadGetBytesAtOffset: * ОШИБКА * CGImageSource создан с размером данных: 684918 - только текущий размер: 526399
: ImageIO: CGImageReadGetBytesAtOffset: * ОШИБКА * CGImageSource создан с размером данных: 203207 - только текущий размер: 199641
Код ниже, спасибо за любую помощь в решении этой проблемы, спасибо.
-(UIColor *) averageColorOfImageTitleArea {
//CGRect croppedImageRect = CGRectMake (6,0,100,29);
CGRect croppedImageRect = CGRectMake (0,0,1,1);
CGImageRef imageRef = CGImageCreateWithImageInRect (self._collectionViewImage.image.CGImage,croppedImageRect);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char rgba[4];
CGContextRef context = CGBitmapContextCreate(rgba, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), imageRef);
if(rgba[3] > 0) {
CGFloat alpha = ((CGFloat)rgba[3])/255.0;
CGFloat multiplier = alpha/255.0;
return [UIColor colorWithRed:((CGFloat)rgba[0])*multiplier
green:((CGFloat)rgba[1])*multiplier
blue:((CGFloat)rgba[2])*multiplier
alpha:alpha];
}
else {
return [UIColor colorWithRed:((CGFloat)rgba[0])/255.0
green:((CGFloat)rgba[1])/255.0
blue:((CGFloat)rgba[2])/255.0
alpha:((CGFloat)rgba[3])/255.0];
}
CGContextRelease(context);
CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpace);
}
3 ответа
Прежде всего извините за поздний ответ, но, возможно, это поможет кому-то с той же проблемой. Основная причина в том, что imageIO не может загрузить изображение так быстро, как вам нужно для моего примера, который я переупорядочивал UITableViewCell
, Возможно, это поможет кому-то с его логикой. И попробуйте загрузить Image в NSData, а затем конвертировать в UIImage.
Например в cellForRowAtIndexPath
let image = UIImagePNGRepresentation(self.imageArray[indexPath.row])
let returnImage = UIImage(data: image)
Так что, если вы загружаете returnImage
в imageIO func или func, который использует CGContext, попробуйте дать значение returnImage
Это случилось со мной тоже. В моём случае пока вырезал картинку. Я думаю, это потому, что iCloud страдал от временного сбоя в работе сети. Вероятно, лучше всего подать отчет об ошибке.
Я получал эту ошибку, потому что API, который я вызывал, выбрасывал 500 и возвращал html страницу ошибки в файле tmp >> NSData, который я пытался преобразовать в PNG.
Я предполагал статус-код 200 и tmp был png.
Вы можете проверить файл, который вы пытаетесь открыть, это изображение перед конверсией.
Вы можете проверить размер файла в байтах 199641 и поставить точку останова
Вот как я выследил проблему CGImageSource при загрузке изображения
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){
print("didFinishDownloadingToURL[\(location) countOfBytesReceived:\(downloadTask.countOfBytesReceived)]")
if let httpResponse = downloadTask.response as? HTTPURLResponse{
if httpResponse.statusCode == 200{
//----------------------------------------------------------------------------------------
//200 - start
//----------------------------------------------------------------------------------------
if (downloadTask.countOfBytesReceived == 199641){
//bytesize metioned in
: ImageIO: CGImageReadGetBytesAtOffset : * ERROR * CGImageSource was created with data size: 203207 - current size is only: 199641
}else{
//----------------------------------------------------------------------------------------
//Image OK
//----------------------------------------------------------------------------------------
}
//----------------------------------------------------------------------------------------
//200 - 3nd
//----------------------------------------------------------------------------------------
}
else if httpResponse.statusCode == 500
{
//check the tmp file in location path
}else{
}
}else{
appDelegate.log.error("ERROR downloadTask.response NOT HTTPURLResponse for taskDescription:'\(cacheKeyString)' - 500")
}
}