【发布时间】:2013-01-08 15:23:58
【问题描述】:
我需要捕获桌面图像并处理其 RGB 数据,我正在使用 Quartz API 来做同样的事情,
我面临的问题是,高内存使用率,
请参考功能,
在此处编辑, 这个函数通过 pThread 被调用;像这样的,
void ImageProcessing::thread(){
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
ImgRef sImageRef
while( active){
**strong text**
if ([currentWnd getCurrentRGBImage:¤tImg]){
/* do something here */
}
}
[pool release];
}
-(bool)getCurrentRGBImage:(ImgRef *)pImgRef{
CGImageRef pCGImageRef;
pCGImageRef = [self getDesktopImage];
if ( !pCGImageRef ){
NSLog(@" got NULL Image ");
CGImageRelease(pCGImageRef);
pCGImageRef = NULL;
return NO;
}
// Create a bitmap rep from the image...
size_t width = CGImageGetWidth(pCGImageRef);
size_t height = CGImageGetHeight(pCGImageRef);
int bytesPerRow = CGImageGetBytesPerRow(pCGImageRef);
int bytesPerPixel = CGImageGetBitsPerPixel(pCGImageRef)/8;
CGDataProviderRef provider = CGImageGetDataProvider(pCGImageRef);
CFDataRef pData = CGDataProviderCopyData(provider);
const uint8_t* bytes = (const uint8_t *)CFDataGetBytePtr(pData);
/***** ------------- *********
Copy RAW Bytes to pImgRef
****************************/
CGDataProviderRelease(provider);
CFRelease(pData);
CGImageRelease(pCGImageRef);
pCGImageRef = NULL;
return YES;
}
而getDesktopImage函数是
-(CGImageRef)getDesktopImage{
CGImageRef screenShot;
screenShot = CGWindowListCreateImage(CGRectInfinite, kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
return screenShot;
}
问题是,总的来说这个函数消耗大量内存,*pImgRef 有一个且只有一个实例,只有像素,RGB 操作,
内存使用我指的是 Mac Activity Monitor,它可靠吗?
文档Documentation for CGDataProviderRelease 提到应用程序需要保持它的保留和释放,所以我正在调用 CGDAtaProviderRelease 但在控制台中收到消息 在 auto_refcount_underflow_error 上中断的 malloc 引用计数下溢进行调试
我不应该调用 CGDataProviderRelease() 吗?如果我评论我没有收到这条消息,所以不确定它是在 Quartz 中还是在我的代码中,
另外,这个函数正在消耗大量内存,如果我检查活动监视器,假设它真的在使用这么多内存是否安全?
【问题讨论】:
标签: objective-c cocoa quartz-graphics cgimageref