首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 8.1崩溃(EXC_BAD_ACCESS):<Error>:ImageIO: CGImageReadGetBytesAtOffset:* ERROR * CGImageSource是用数据大小创建的:

iOS 8.1崩溃(EXC_BAD_ACCESS):<Error>:ImageIO: CGImageReadGetBytesAtOffset:* ERROR * CGImageSource是用数据大小创建的:
EN

Stack Overflow用户
提问于 2015-01-19 07:18:00
回答 3查看 1.7K关注 0票数 0

感谢任何帮助修复我的iOS应用程序中的崩溃(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:* ERROR * CGImageSource是用数据大小: 684918创建的-当前大小仅为: 526399 :ImageIO: CGImageReadGetBytesAtOffset:* ERROR * CGImageSource是用数据大小: 203207创建的-当前大小仅为: 199641

代码如下,感谢任何帮助解决这个问题,谢谢。

代码语言:javascript
复制
-(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);

}
EN

回答 3

Stack Overflow用户

发布于 2015-01-28 12:13:43

这也发生在我身上。在我的情况下剪照片的时候。我猜这是因为iCloud受到了暂时的网络故障的困扰。也许最好是提交一份错误报告。

票数 0
EN

Stack Overflow用户

发布于 2015-10-06 11:22:58

首先,对迟来的回答表示歉意,但也许这会对有同样问题的人有所帮助。主要原因是imageIO不能像您需要的那样快速加载图像--我的示例是重新排序UITableViewCell。也许这会对他的逻辑学有所帮助。并尝试将图像加载到NSData中,然后转换为UIImage。

例如,在cellForRowAtIndexPath

代码语言:javascript
复制
  let image = UIImagePNGRepresentation(self.imageArray[indexPath.row])
  let returnImage = UIImage(data: image)

因此,如果将returnImage加载到使用CGContext的imageIO func或func中,请尝试给出值returnImage

票数 0
EN

Stack Overflow用户

发布于 2016-12-06 16:02:58

我得到这个错误是因为我调用的api在我试图转换为PNG的tmp >> NSData文件中抛出了一个500并返回html错误页。

我假设statusCode为200,而tmp是png。

您可能希望在转换之前检查您试图打开的文件是图像。

您可以检查文件的字节大小为199641并放入断点。

以下是我在下载图像时如何跟踪CGImageSource问题

代码语言:javascript
复制
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")
        }


}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28019631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档