Сбой 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")
        }


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