शीर्षक की तरह कहते हैं, मैं छविग्रैब.grab() मॉड्यूल को कॉन्फ़िगर करने का कोई तरीका है, उदाहरण के लिए, एक बहु-मॉनीटर सेटअप में बाएं की बजाय दाएं स्क्रीन को पकड़ने के लिए कोई तरीका है।पायथन पीआईएल लाइब्रेरी - क्या एक बहु-मॉनीटर सेटअप में कौन सी स्क्रीन ImageGrab.grab() grabs चुनने का कोई तरीका है?
उत्तर
दुर्भाग्य से यह संभव नहीं है, जिस तरह से पीआईएल डिस्प्ले डिवाइस के आयाम प्राप्त करता है।
screen = CreateDC("DISPLAY", NULL, NULL, NULL);
(display.c, लाइन 296, संस्करण 1.1.7)
हालांकि, प्रदर्शन प्राप्त करने के लिए: जब यह डिवाइस संदर्भ प्राप्त करता है, यह सभी संलग्न पर नज़र रखता है के लिए इसे प्राप्त करता है
width = GetDeviceCaps(screen, HORZRES);
height = GetDeviceCaps(screen, VERTRES);
(display.c, लाइनों 299-300, संस्करण 1.1.7)
: आयाम, यह इस कोड का उपयोग करता हैजो केवल प्राथमिक, सक्रिय मॉनीटर के आयामों को लौटाता है। बाद के सभी ऑपरेशन इन चौड़ाई और ऊंचाई मानों के साथ किए जाते हैं, जिसके परिणामस्वरूप अंतिम छवि होती है जो केवल प्राथमिक प्रदर्शन का आकार होता है।
width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
जो बाद आप जनहित याचिका पुन: संयोजित करने होंगे:
आदेश सभी संलग्न मॉनिटर की एक screengrab प्राप्त करने के लिए, उन दो पंक्तियों की तरह कुछ के साथ प्रतिस्थापित करने की आवश्यकता होगी। यह आपको वर्चुअल स्क्रीन के आयाम प्रदान करेगा, जो "... सभी प्रदर्शन मॉनीटरों के बाध्य आयत" है। [MSDN]
एक अधिक सही कार्यान्वयन ImageGrab.grab() के इंटरफेस में फेरबदल (या जोड़ने एक नया कार्य) के साथ अलग-अलग नज़र रखता है के लिए डिवाइस संदर्भों प्राप्त करने के लिए EnumDisplayMonitors का उपयोग कर, के साथ एक विशेष के चयन के लिए अनुमति देने के लिए किया जाएगा मॉनिटर, जिसके डिवाइस संदर्भ का शेष परिचालनों के लिए उपयोग किया जाएगा।
आपके दूसरे कार्यान्वयन में, मैं enumDisplayMonitors के माध्यम से मॉनीटर के लिए हैंडल ढूंढने में सक्षम था .. लेकिन अगले चरण के लिए, मुझे सी की आवश्यकता होगी, या यह ImageGrab मॉड्यूल में किया जा सकता है? यदि मैं आपको सही तरीके से अनुसरण कर रहा हूं, तो मुझे जो फ़ंक्शन बनाना है, उसे CreateDC ("DISPLAY", NULL, NULL) कॉल को संशोधित करने की आवश्यकता होगी, डिवाइस हैंडल के लिए 'DISPLAY' को प्रतिस्थापित करना, मैं स्नैपशॉट लेना चाहता हूं? – Zack
क्षमा करें कि मैं स्पष्ट नहीं था, दोनों विकल्पों में पीआईएल के लिए सी स्रोत कोड को संशोधित करने और इसे पुन: संकलित करने की आवश्यकता है। आप सही हैं, CreateDC फ़ंक्शन को बदलने की आवश्यकता है। – Andrew