- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 CGImage 创建 CVPixelBufferRef 所以这里是方法:
- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image
{
CGImageRetain(image);
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
[NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
nil];
CVPixelBufferRef pxbuffer = NULL;
CVPixelBufferCreate(kCFAllocatorDefault, CGImageGetWidth(image),
CGImageGetHeight(image), kCVPixelFormatType_32ARGB, (CFDictionaryRef) options,
&pxbuffer);
CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pxdata, CGImageGetWidth(image),
CGImageGetHeight(image), 8, 4*CGImageGetWidth(image), rgbColorSpace,
kCGImageAlphaNoneSkipFirst);
CGContextRetain(context);
CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
CGImageGetHeight(image)), image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
CGContextRelease(context);
CGImageRelease(image);
return pxbuffer;
}
我经常调用这个方法,它是用于生成视频帧,25fps。大多数情况下这工作正常,但在某些时候它会在这行代码上崩溃:
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
CGImageGetHeight(image)), image);
我已经测试了内存使用和内存泄漏,一切都很好,但挤压仍然发生。
崩溃堆栈:线程 6 崩溃:
0 ImageIO 0x39270806 CGImageReadGetBytesAtOffset + 34
1 ImageIO 0x392707d6 CGImageReadSessionGetBytes + 22
2 ImageIO 0x39280c3c fill_input_buffer + 148
3 ImageIO 0x3928003a read_markers + 154
4 ImageIO 0x3927fd82 consume_markers + 34
5 ImageIO 0x3927fbd2 _cg_jpeg_consume_input + 66
6 ImageIO 0x3927fb62 _cg_jpeg_read_header + 38
7 ImageIO 0x39292782 copyImageBlockSetJPEG + 2346
8 ImageIO 0x3928953e ImageProviderCopyImageBlockSetCallback + 510
9 CoreGraphics 0x38e0b9d6 CGImageProviderCopyImageBlockSetWithOptions + 158
10 CoreGraphics 0x38e0b66a img_blocks_create + 370
11 CoreGraphics 0x38e07a98 img_data_lock + 1488
12 CoreGraphics 0x38e06d2a CGSImageDataLock + 126
最佳答案
从崩溃堆栈来看,您的图像本身似乎已在其他线程上释放,可能在您调用CGImageRetain()
之前。 .事实上,您正在调用CGImageRetain()
这里表明您期望如此。但如果是这样的话,保留是不够的,因为它会产生竞争条件。在您尝试保留图像之前,该图像可能已被破坏。所以要么CGImageRetain
是不必要的或者是不够的。在任何情况下,它都不应该在这里(也不应该是它的平衡 CGImageRelease
)。
这表明在其他线程上使用此图像非常危险,这要么表明您奇怪地调用了此方法,要么表明您让线程变得过于复杂。例如,如果您使用 NSThread
直接,你可能让它变得太复杂了。
我会审核此图像上的其他保留和释放,并确保它们不会在调用此方法的过程中发生。我很确定这就是正在发生的事情。
旁注:你有一个多余的CGContextRetain
/CGContextRelease
那些是不需要的。当您调用CGBitmapContextCreate()
时,其中包含保留(名称中包含“Create”)。也就是说,这只是一个小性能问题;你已经正确地平衡了它们。但它表明您其他地方的内存管理也可能很奇怪,因此您应该对其进行审核。
关于iphone - CGContextDrawImage 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13767685/
我已经尝试混合两个 UIImage 大约 2 天了,但我收到了一些 BAD_ACCESS 错误。首先,我有两个具有相同方向的图像,基本上我使用 CoreGraphics 进行混合。 一个奇怪的细节,每
我使用时序分析工具确定 95% 的时间都花在调用函数 CGContextDrawImage 上。 在我的应用程序中,有很多重复的图像被重复地从 Sprite map 中截取并绘制到屏幕上。我想知道是否
我正在使用 PhotoScrollerNetwork project为我的项目中的 View 提供单个高分辨率图像并自动平铺它,以便正确管理内存。它使用此代码块将完整的高分辨率图像绘制到内存中,以便可
我正在尝试使用 AVCaptureSession 获取图像。我遵循了本教程 http://www.benjaminloulier.com/posts/2-ios4-and-direct-access-
我正在尝试从 CGImage 创建 CVPixelBufferRef 所以这里是方法: - (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef
由于 CGContextDrawImage 可能非常昂贵,因此我在检查像素数据时尽量减少提供给它的数据量。如果我有两个图像和它们交集的 CGRect,我能否让 CGContextDrawImage 仅
我正在尝试比较两个图像(实际上是在较大的图像中找到较小的“子图像”),并且我正在使用下面提供的方法加载图像。 下面的代码现在包含一个测试 for 循环,它总结了所有单独的字节值。我发现这个总和和因此字
我正在尝试制作一个可以使用 CGContextDrawImage(…) 绘制大型(比如 2048 x 1537)图像的一部分的对象。它工作得很好,除了它非常模糊。我正在使用覆盖 drawLayer:i
我有一个自定义 View ,它使用以下方法绘制 CGImage: - (void) drawImage { CGContextRef context = (CGContextRef)[[NSG
我正在使用 Cocoa 和 Xcode4 在 Mac OS X 10.6 上开发 Mac 应用程序,从相机缓冲区获取图像后,我需要获取图像的原始数据。这是代码: - (void)captureOutp
对 GCContextDrawImage 的调用最终成为我的 Mac OS X 应用程序的瓶颈,尤其是在视网膜屏幕上。我设法通过 Avoiding colorspace transformations
在运行了以下代码块之后,我得到了 CGContextDrawImage 的无效上下文 0x0。此代码位于 UIViewController 中的用户定义方法中。我本质上是通过使用 AVFoundati
为什么图像旋转,通过调用CGContextDrawImage。感谢您的帮助。 // Initialization code UIImage *img = [UIImage imageNamed:@"l
有时 CGContextDrawImage 会导致执行以下代码时出现“访问错误”我们无法找到原因。有没有人在使用“CGContextDrawImage”时遇到过同样的错误? let bytes
我使用这段代码缩放和旋转用照相机拍摄的图像。当我使用它时,我可以看到一个巨大的内存峰值。大约 20 MB。当我使用仪器时,我可以看到这一行: CGContextDrawImage(ctxt, orig
我正在尝试编写一个 iPhone 应用程序,它采用 PNG tilesets 并在屏幕上显示它们的片段,并且我试图让它以 20fps 的速度刷新整个屏幕。目前我在模拟器上管理大约 3 或 4fps,在
我目前在 OSX 上使用 CoreGraphics 进行了大量工作。 我对我的代码运行了 Time Profiler,发现最大的问题在于 CGContextDrawImage。它是每秒被调用多次的循环
如何在中心旋转由 CGContextDrawImage() 绘制的图像? 在drawRect: CGContextSaveGState(c); rect = CGRectOffset(rect, -r
我想轻松地将 UIImage 混合到另一个背景图像之上,因此为 UIImage 编写了一个类别方法,改编自 blend two uiimages based on alpha/transparency
我试图制作一个可调整大小的图像,但无法弄清楚这一点。 当我使用 UIImage *bgImage = [[UIImage imageNamed:@"logout-bg"] resizableImage
我是一名优秀的程序员,十分优秀!