我需要捕获桌面图像并处理其 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的内存使用情况,它可靠吗?
CGDataProviderRelease的文档文档提到应用程序需要保持保留和释放它,所以我正在调用 CGDAtaProviderRelease 但在控制台 malloc 引用计数下溢中获取消息,以便在 auto_refcount_underflow_error 上进行调试
我不应该调用 CGDataProviderRelease() 吗?如果我评论我没有收到这条消息,所以不确定它是在 Quartz 中还是在我的代码中,
此外,这个函数正在消耗大量内存,如果我检查活动监视器,假设它真的在使用这么多内存是否安全?