我遇到了一个问题,我无法从调用CGDataProviderCopyData
时返回的Image中获取像素数据(通过CGImageCreate
)。任何其他调用,我都可以从图像中获取数据而没有任何问题,所以显然我正在使用我传入的参数做错了。
为了确保我有“好”的像素数据,我从CGWindowListCreateImage
返回的图像中提取它。此外,为了验证这个像素数据不是故障点,我有测试将其转换为PIL图像并将其保存到文件,以便我可以验证这是否应该如此。
display_monitor = get_rightmost_monitor()
image = CG.CGWindowListCreateImage(
CG.CGRectInfinite,
CG.kCGWindowListOptionOnScreenOnly,
display_monitor,
CG.kCGWindowImageDefault
)
new_image = CG.CGBitmapContextCreateImage(context)
prov = CG.CGImageGetDataProvider(new_image)
data = CG.CGDataProviderCopyData(prov)
return data
出于测试目的,我只是尝试重新创建像素数据所来自的图像对象。因此,我将第一个图像的所有属性提供给CGImageCreate
函数的参数。
rebuilt_image = CG.CGImageCreate(
CG.CGImageGetWidth(image), # width
CG.CGImageGetHeight(image), # height
CG.CGImageGetBitsPerComponent(image), # bitsPerComponent
CG.CGImageGetBitsPerPixel(image), # bitsPerPixel
CG.CGImageGetBytesPerRow(image), # bytesPerRow
CGImageGetColorSpace(image), # colorspace
CG.CGImageGetBitmapInfo(image), # bitmapInfo
data, # pixel data from image
None, # decode
False, # shouldInterpolate
CG.kCGRenderingIntentDefault)
现在,创建Image时不会抛出任何错误。但是,在调用CGDataProviderCopyData
提取像素数据时,所有内容都会崩溃并吐出此错误:
<Error>: copy_read_only: vm_copy failed: status 1
尽管我用谷歌搜索最好,但我无法弄清楚是什么导致了这种失败。 SO上有类似的问题like this one。但是,它们与我遇到的问题不太一致,或者由于我对Core Graphics框架缺乏经验,我无法将这些问题中提供的解决方案转换为适用于我的问题的内容。
有人可以清楚我出错的地方吗?
谢谢!