- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我设置了一个 VirtualBox 来使用两个显示器。我尝试在第二台显示器上截取一个窗口的屏幕截图:
import ImageGrab
im = ImageGrab.grab(windowrect)
im.save("img.png")
windowrect
我验证了窗口的正确矩形,在本例中为 (1616, 2, 2594, 732)
。然而,img.png
只是一个大黑框。任何想法如何解决屏幕抓取和 VirtualBox 之间的这种交互,以便我可以截取第二个虚拟监视器的屏幕截图?
最佳答案
我遇到过同样的问题。如果非要我猜的话,我会假设 ImageGrab
是从 SM_SCREEN 标志获取坐标的,它只给出主显示器的坐标,而不是 SM_VIRTUALSCREEN,它给出整个虚拟屏幕(不过我还没有查看源代码,所以只是猜测)。
也就是说,通过直接与 Windows API 交互,然后将其位图输出转换为更有用的 PIL 对象,很容易解决这个问题。
def _get_screen_buffer(self, bounds=None):
# Grabs a DC to the entire virtual screen, but only copies to
# the bitmap the the rect defined by the user.
SM_XVIRTUALSCREEN = 76 # coordinates for the left side of the virtual screen.
SM_YVIRTUALSCREEN = 77 # coordinates for the right side of the virtual screen.
SM_CXVIRTUALSCREEN = 78 # width of the virtual screen
SM_CYVIRTUALSCREEN = 79 # height of the virtual screen
hDesktopWnd = windll.user32.GetDesktopWindow() #Entire virtual Screen
left = windll.user32.GetSystemMetrics(SM_XVIRTUALSCREEN)
top = windll.user32.GetSystemMetrics(SM_YVIRTUALSCREEN)
width = windll.user32.GetSystemMetrics(SM_CXVIRTUALSCREEN)
height = windll.user32.GetSystemMetrics(SM_CYVIRTUALSCREEN)
if bounds:
left, top, right, bottom = bounds
width = right - left
height = bottom - top
hDesktopDC = windll.user32.GetWindowDC(hDesktopWnd)
if not hDesktopDC: print 'GetDC Failed'; sys.exit()
hCaptureDC = windll.gdi32.CreateCompatibleDC(hDesktopDC)
if not hCaptureDC: print 'CreateCompatibleBitmap Failed'; sys.exit()
hCaptureBitmap = windll.gdi32.CreateCompatibleBitmap(hDesktopDC, width, height)
if not hCaptureBitmap: print 'CreateCompatibleBitmap Failed'; sys.exit()
windll.gdi32.SelectObject(hCaptureDC, hCaptureBitmap)
SRCCOPY = 0x00CC0020
windll.gdi32.BitBlt(
hCaptureDC,
0, 0,
width, height,
hDesktopDC,
left, top,
0x00CC0020
)
return hCaptureBitmap
def _make_image_from_buffer(self, hCaptureBitmap):
import Image
bmp_info = BITMAPINFO()
bmp_header = BITMAPFILEHEADER()
hdc = windll.user32.GetDC(None)
bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER)
DIB_RGB_COLORS = 0
windll.gdi32.GetDIBits(hdc,
hCaptureBitmap,
0,0,
None, byref(bmp_info),
DIB_RGB_COLORS
)
bmp_info.bmiHeader.biSizeImage = bmp_info.bmiHeader.biWidth *abs(bmp_info.bmiHeader.biHeight) * (bmp_info.bmiHeader.biBitCount+7)/8;
size = (bmp_info.bmiHeader.biWidth, bmp_info.bmiHeader.biHeight )
print size
pBuf = (c_char * bmp_info.bmiHeader.biSizeImage)()
windll.gdi32.GetBitmapBits(hCaptureBitmap, bmp_info.bmiHeader.biSizeImage, pBuf)
return Image.frombuffer('RGB', size, pBuf, 'raw', 'BGRX', 0, 1)
第一个函数获取屏幕的位图,第二个函数将其转换为 PIL 对象。
如果你不想自己弄清楚其他监视器的坐标,我有一个名为 PyRobot 的小模块。它具有针对特定监视器的功能等等。而且它是纯 Python,所以不需要安装 PyWin32 :)
关于python - PIL ImageGrab 在 VirtualBox 的第二个虚拟监视器上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3585293/
我想使用 PHP 在我的本地 Vista 计算机上抓取屏幕截图。对于初学者来说,我只想设置标准示例: $browser = new COM("InternetExplorer.Application"
我正在使用 PIL 中的 ImageGrab 来获取屏幕上特定像素的 RGB 值。我无法理解在哪里设置 x 和 y 坐标以获取像素。这是到目前为止的模式代码: from PIL import Imag
我目前正在创建一个 PianoTiles AI,它必须从 ImageGrab 中找到所有黑色像素。我已经获得了图像抓取的所有位置,但是我需要找出其中是否有黑色像素,如果有,它们在哪里,以便我的人工智能
当我运行以下代码时,它会打开一个具有适当尺寸的新窗口并正确显示屏幕...但它会不断在顶部和内部打开新的和新的窗口。 import numpy as np from PIL import ImageGr
我正在 try catch 游戏的像素来编写机器人脚本。我有一个简单的功能: def printPixel(): while True: flags, hcursor, (x,y) = w
所以我需要每秒获取一堆屏幕截图,例如 5 个。我正在使用它来为游戏编写机器人程序。然而 imagegrab 方法大约需要 0.3 秒,这对我来说太慢了。即使在指定了 bbox 值之后,它仍然需要 0.
这个问题在这里已经有了答案: Python Imaging Library fails to grab whole screen (2 个答案) 关闭 4 年前。 我试图使用 PIL.ImageGr
我获得了使用 pillow ImageGrab 在 python 中录制屏幕的代码,这在我的 python 3.5 版本中无法正常工作。视频帧的大小不断减小。 import numpy as np f
我花了一个小时研究这个简单的主题,但我遇到的所有答案都非常复杂,作为 Python 新手,我无法将它们中的任何一个合并到我的程序中。 我正在尝试让人工智能玩浏览器版本的钢琴 block 游戏。截至目前
我想知道如何从 Pillow 5.0.0 保存 ImageGrab(), 我使用Pycharm,我的代码是: from PIL import ImageGrab, Image m1 = ImageGr
我正在学习这个与屏幕交互的教程,但它是针对 Windows 操作系统完成的,因为 ImageGrab 在 linux 中不可用 import numpy as np from PIL import I
如标题所说,我很好奇是否有一种方法可以配置 ImageGrab.grab() 模块以抓取例如右侧屏幕,而不是多显示器设置中的左侧屏幕。 最佳答案 不幸的是,由于 PIL 获取显示设备尺寸的方式,这是不
我正在尝试使用此代码捕获全屏 (1920 x 1080)。不过,保存的图像只有 1536 x 864。 解决方案:正如 Mark 在下面指出的那样,Windows 具有缩放功能,可以通过“控制面板”>
如何以特定方式使用 ImageGrab.grab()) 来捕获所选窗口而不是整个屏幕或边界框? 为了更好地理解,我目前使用下面的这一行,它基本上捕获了给定的边界框: screen =
我设置了一个 VirtualBox 来使用两个显示器。我尝试在第二台显示器上截取一个窗口的屏幕截图: import ImageGrab im = ImageGrab.grab(windowrect)
我一直在尝试检查屏幕上的像素是否正在变化。我需要做什么? 我上网冲浪了很长时间,但没有成功。我对网上给出的代码进行了实验,发现我的代码仅从运行代码时打开的屏幕提供数据。即,如果代码运行时屏幕是白色的,
我想在我的应用程序中使用 imageGrab。我的笔记本电脑是装有 OSX 的 macbook。 当我使用 Pillow 时出现此错误: ImportError: ImageGrab is Windo
我正在用 python 制作一个屏幕捕获程序。我当前的问题是 PIL.ImageGrab.grab() 给我的输出与 2 秒后的输出相同。例如,因为我想我不清楚,在下面的程序中,几乎所有图像都是相同的
我正在用 python 制作一个机器人。我想将特定像素的颜色与另一种颜色(83、83、83)进行比较。 我尝试与带有单引号和双引号的字符串进行比较。它不起作用,所以我认为它可能是一个数组。 这是我的机
我有以下功能: def take_screenshot(x1, y1, x2, y2): img = ImageGrab.grab(bbox=(x1, y1, x2, y2)) ret
我是一名优秀的程序员,十分优秀!