Al igual que el título dice, tengo curiosidad por saber si hay una forma de configurar el módulo ImageGrab.grab() para, por ejemplo, capturar la pantalla derecha, en lugar de la izquierda en una configuración de múltiples monitores.Biblioteca de Python PIL-- ¿Hay alguna manera de seleccionar qué pantalla toma ImageGrab.grab() en una configuración de múltiples monitores?
Respuesta
Desafortunadamente no es posible, debido a la manera en que el PIL obtiene las dimensiones del dispositivo de visualización. Cuando se obtiene el contexto de dispositivo, se hace obtener una para todos los monitores conectados:
screen = CreateDC("DISPLAY", NULL, NULL, NULL);
(display.c, línea 296, versión 1.1.7)
Sin embargo, para obtener la pantalla dimensiones, utiliza este código:
width = GetDeviceCaps(screen, HORZRES);
height = GetDeviceCaps(screen, VERTRES);
(display.c, líneas 299-300, versión 1.1.7)
que solo devuelve las dimensiones del monitor primario activo. Todas las operaciones posteriores se realizan con estos valores de ancho y alto, lo que da como resultado una imagen final que solo tiene el tamaño de la pantalla principal.
Con el fin de recibir una Screengrab de todos los monitores conectados, tendría que ser reemplazado con algo así como esas dos líneas:
width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
Después de que había necesidad de recompilar PIL. Esto le proporcionará las dimensiones de la pantalla virtual, que es "... el rectángulo delimitador de todos los monitores de visualización". [MSDN]
Una implementación más correcta sería usando EnumDisplayMonitors obtener contextos de dispositivo para los monitores individuales, junto con la alteración ImageGrab.grab() 's interfaz (o la adición de una nueva función) para permitir la selección de una específica monitor, de cuyo dispositivo se usaría el contexto para las operaciones restantes.
- 1. Captura de pantalla Python 2+ monitores (ventanas)
- 2. Detectar ancho de pantalla para monitores múltiples
- 3. ¿Hay alguna manera de agregar múltiples receptores en Python SMTPlib?
- 4. Múltiples monitores en .NET
- 5. Ejecución de pantalla completa de VNC con monitores múltiples
- 6. ¿Hay alguna manera de acceder al hardware directamente en Python?
- 7. java y pantalla completa a través de múltiples monitores
- 8. ¿Hay alguna manera de seleccionar múltiples tipos de campos de entrada con CSS?
- 9. ¿Hay alguna manera de desactivar una etiqueta?
- 10. ¿Hay alguna manera de usar errno de forma segura en una aplicación de subprocesos múltiples?
- 11. ¿Hay alguna manera de seleccionar los nodos hermanos?
- 12. ¿Hay alguna manera de resaltar búsquedas múltiples en (g) Vim?
- 13. Visor VNC con monitores múltiples
- 14. ¿Hay alguna manera de establecer múltiples valores predeterminados en un dict de Python usando otro dict?
- 15. ¿Hay alguna manera de saber qué compilador generó una biblioteca estática?
- 16. ¿Hay una biblioteca de Python para generar archivos .ico?
- 17. Cómo determinar en qué pantalla está la barra de tareas
- 18. Coordenadas incorrectas en monitores múltiples
- 19. ¿Hay alguna manera de dibujar primitivas en 3D con Python?
- 20. iSeries DB2: ¿hay alguna manera de seleccionar el valor de identidad de una instrucción de inserción?
- 21. ¿Hay alguna manera de mezclar cadenas en Python?
- 22. ¿Hay alguna manera de identificar un método heredado en Python?
- 23. ¿Hay alguna manera de tomar una captura de pantalla en MS-Access con vba?
- 24. ¿Hay alguna manera de pausar una CABasicAnimation?
- 25. Monitores de pantalla con más de 256 tonos de gris
- 26. ¿Hay alguna manera de "limpiar" una superficie?
- 27. estallido de la toma de seleccionar
- 28. Desarrollo para monitores múltiples
- 29. monitores dobles de pygame y pantalla completa
- 30. ¿Hay alguna forma de garantizar que una biblioteca de clases use su propia configuración de aplicación?
En su segunda implementación, pude encontrar los controladores para los monitores a través de enumDisplayMonitors ... pero para el siguiente paso, ¿necesitaría C, o puedo hacerlo en el módulo ImageGrab? Si te sigo correctamente, la función que tengo que crear necesitaría modificar la llamada a CreateDC ("DISPLAY", NULL, NULL), sustituyendo "DISPLAY" por el Device Handle del que quiero tomar instantáneas. – Zack
Disculpe que no estaba claro, las dos opciones requieren modificar el código fuente C para PIL y volver a compilarlo. Estás en lo correcto, la función CreateDC es lo que necesita ser modificado. – Andrew