调用CGDataProviderCopyData时,错误vm_copy的Python崩溃失败

时间:2014-01-16 01:20:49

标签: python macos core-graphics quartz-graphics pyobjc

我遇到了一个问题,我无法从调用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框架缺乏经验,我无法将这些问题中提供的解决方案转换为适用于我的问题的内容。

有人可以清楚我出错的地方吗?

谢谢!

0 个答案:

没有答案