0

如何在不将图像保存到 osx 上的磁盘的情况下将 CGImageRef 转换为 PIL?

我想从 CGImageRef 获取原始像素数据并使用 Image.fromstring() 来制作 PIL 图像

import mss
import Quartz.CoreGraphics as CG
from PIL import Image

mss = mss.MSSMac()
for i, monitor in enumerate(mss.enum_display_monitors(0)):
    imageRef = mss.get_pixels(monitor)
    pixeldata = CG.CGDataProviderCopyData(CG.CGImageGetDataProvider(imageRef))
    img = Image.fromstring("RGB", (monitor[b'width'], monitor[b'height']), pixeldata)
    img.show()

但这并没有给我正确的图像。

这是我期望的图像:

在此处输入图像描述

这是我在 PIL 中得到的图像:

在此处输入图像描述

4

2 回答 2

0

来自 CG 的屏幕截图不一定使用 RGB 颜色空间。它可能使用 RGBA 或其他东西。尝试改变:

img = Image.fromstring("RGB", (monitor[b'width'], monitor[b'height']), pixeldata)

img = Image.fromstring("RGBA", (monitor[b'width'], monitor[b'height']), pixeldata)

以下是我检测实际捕获的颜色空间的方法:

bpp = CG.CGImageGetBitsPerPixel(imageRef)
info = CG.CGImageGetBitmapInfo(imageRef)
pixeldata = CG.CGDataProviderCopyData(CG.CGImageGetDataProvider(imageRef))

img = None
if bpp == 32:
    alphaInfo = info & CG.kCGBitmapAlphaInfoMask
    if alphaInfo == CG.kCGImageAlphaPremultipliedFirst or alphaInfo == CG.kCGImageAlphaFirst or alphaInfo == CG.kCGImageAlphaNoneSkipFirst:
        img = Image.fromstring("RGBA", (CG.CGImageGetWidth(imageRef), CG.CGImageGetHeight(imageRef)), pixeldata, "raw", "BGRA")
    else:
        img = Image.fromstring("RGBA", (CG.CGImageGetWidth(imageRef), CG.CGImageGetHeight(imageRef)), pixeldata)
elif bpp == 24:
    img = Image.fromstring("RGB", (CG.CGImageGetWidth(imageRef), CG.CGImageGetHeight(imageRef)), pixeldata)
于 2015-05-18T20:53:53.527 回答
0

这是我前段时间修复的一个错误。mss以下是如何使用最新版本(2.0.22)实现您想要的:

from mss.darwin import MSS
from PIL import Image

with MSS() as mss:
    for monitor in mss.enum_display_monitors(0):
        pixeldata = mss.get_pixels(monitor)
        img = Image.frombytes('RGB', (mss.width, mss.height), pixeldata)
        img.show()

请注意,这pixeldata只是一个参考mss.image,您可以直接使用它。

于 2017-05-09T09:25:36.313 回答