Python 由CGWindowListCreateImage/PNGCanvas生成时,导出的PNG图像看起来混乱
我有以下Python代码: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
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等看起来只起作用。。。