Python 由CGWindowListCreateImage/PNGCanvas生成时,导出的PNG图像看起来混乱

Python 由CGWindowListCreateImage/PNGCanvas生成时,导出的PNG图像看起来混乱,python,macos,png,quartz-core,Python,Macos,Png,Quartz Core,我有以下Python代码: import Quartz.CoreGraphics as cg region = cg.CGRectMake(0, 0, 100, 100) # You can also use cg.CGRectInfinite for the full screen. image = cg.CGWindowListCreateImage(region, cg.kCGWindowListOptionOnScreenOnly, cg.kCGNullWindowID, cg.kCGW

我有以下Python代码:

import Quartz.CoreGraphics as cg
region = cg.CGRectMake(0, 0, 100, 100) # You can also use cg.CGRectInfinite for the full screen.
image = cg.CGWindowListCreateImage(region, cg.kCGWindowListOptionOnScreenOnly, cg.kCGNullWindowID, cg.kCGWindowImageDefault)
prov = cg.CGImageGetDataProvider(image)
img_data = cg.CGDataProviderCopyData(prov)
img_width, img_height = cg.CGImageGetWidth(image), cg.CGImageGetHeight(image)

from pngcanvas import PNGCanvas
import struct
canvas = PNGCanvas(img_width, img_height)
for x in range(img_width):
    for y in range(img_height):
        # Calculate offset, based on http://www.markj.net/iphone-uiimage-pixel-color/
        offset = 4 * ((img_width * int(round(y))) + int(round(x)))
        # Pixel data is unsigned char (8bit unsigned integer), and there are for (blue,green,red,alpha).
        # Unpack data from string into Python'y integers.
        b, g, r, a = struct.unpack_from("BBBB", img_data, offset=offset)
        # Assign BGRA color as RGBA.
        canvas.point(x, y, color = (r, g, b, a))

with open("test.png", "wb") as f:
    f.write(canvas.dump())
除了保存的PNG图像看起来杂乱无章之外,它似乎还能工作:


代码逻辑基于此代码(请参阅:
pixel
函数)。我认为上面的代码没有任何问题。我缺少什么?

您链接的帖子中的示例脚本在设置
CGRectMake(0,0,100,100)
时遇到了相同的问题。我没有试过,虽然我猜如果你把你的代码改成
CGRectMake(0,0,400,400)
它就不会被置乱了…@l'l你是对的,400x400很好用。我相信问题在偏移量的计算方法之内,或者是值的解包方式。在看了这一点之后,我注意到图像大小必须是16的倍数,所以基本上16x16、32x32、48x48、64x64等等。似乎只起作用……您链接的帖子中的示例脚本在设置
CGRectMake(0、0、100、100)
时遇到了相同的问题。我没有试过,虽然我猜如果你把你的代码改成
CGRectMake(0,0,400,400)
它就不会被置乱了…@l'l你是对的,400x400很好用。我相信问题在偏移量的计算方法之内,或者是值的解包方式。在看了这一点之后,我注意到图像大小必须是16的倍数,所以基本上16x16、32x32、48x48、64x64等看起来只起作用。。。