2015-09-07 10 views
6

के साथ Graphics.CopyFromScreen का उपयोग करके एक स्क्रीनशॉट लेना मैं अपनी स्क्रीन का एक स्क्रीनशॉट/बिटमैप बनाने की कोशिश कर रहा हूं। मैंने यह फ़ंक्शन लिखा:150% स्केलिंग

public static Bitmap CreateScreenshot(Rectangle bounds) 
{ 
    var bmpScreenshot = new Bitmap(bounds.Width, bounds.Height, 
            PixelFormat.Format32bppArgb); 
    var gfxScreenshot = Graphics.FromImage(bmpScreenshot); 
    gfxScreenshot.CopyFromScreen(bounds.X, bounds.Y, 
     0, 0, 
     new Size(bounds.Size.Width, bounds.Size.Height), 
     CopyPixelOperation.SourceCopy); 
    return bmpScreenshot; 
} 

यह फ़ंक्शन मेरे ओवरले फॉर्म में कॉल किया जा रहा है जिसे बिटमैप को स्वयं पर खींचना चाहिए। मैं वर्तमान में पूरी प्रक्रिया के लिए जीडीआई + का उपयोग कर रहा हूं।

private void ScreenshotOverlay_Load(object sender, EventArgs e) 
{ 
    foreach (Screen screen in Screen.AllScreens) 
     Size += screen.Bounds.Size; 
    Location = Screen.PrimaryScreen.Bounds.Location; 

    _screenshot = BitmapHelper.CreateScreenshot(new Rectangle(new Point(0, 0), Size)); 
    Invalidate(); // The screenshot/bitmap is drawn here 
} 

हाँ, मैं बाद में बिटमैप का निपटान करता हूं, इसलिए चिंता न करें। ;) मेरे लैपटॉप और डेस्कटॉप कंप्यूटर पर यह ठीक काम करता है। मैंने विभिन्न संकल्पों के साथ इसका परीक्षण किया है और गणना सही है। मैं फॉर्म पर स्क्रीन की एक छवि देख सकता हूं।

समस्या सतह 3 के साथ शुरू होती है। सभी तत्वों को 1.5 (150%) के कारक द्वारा स्केल किया जा रहा है। इसका परिणाम यह है कि डीपीआई बदलता है। अगर मैं वहां एक स्क्रीनशॉट लेने की कोशिश करता हूं, तो यह केवल स्क्रीन के ऊपरी-बाएं हिस्से की तरह कैप्चर करता है लेकिन पूरे नहीं। मैं गूगल और StackOverflow के माध्यम से अपने रास्ते बना दिया है और अलग अलग चीजें बाहर की कोशिश की है:

  1. , डीपीआई जाओ 96 से विभाजित और इस पहलू के साथ स्क्रीन के आकार के घटकों (एक्स और वाई) गुणा।
  2. आवेदन डीपीआई-जागरूक बनाने के लिए application.manifest में एक प्रविष्टि जोड़ें।

पहला तरीका वांछित परिणाम नहीं लाया। दूसरे ने किया, लेकिन पूरे एप्लिकेशन को तब समायोजित करना होगा और यह विंडोज फॉर्म में काफी जटिल है।

अब मेरा प्रश्न होगा: क्या पूरे स्क्रीन का स्क्रीनशॉट कैप्चर करने का कोई तरीका है, भले ही इसमें 1 (उच्चतर डीपीआई) से अधिक स्केलेशन कारक हो? इसे हर जगह काम करने के लिए ऐसा करने का एक तरीका होना चाहिए।

लेकिन इस बिंदु पर मेरे पास कोई वास्तविक खोज परिणाम नहीं था जो मेरी मदद कर सकता था। अग्रिम धन्यवाद।

+2

यह "जटिल" नहीं है, तो आप सिर्फ कुछ बुरी आदतों को पढ़ना नहीं है । इसके साथ-साथ अब भी क्रैकिंग हो सकती है, उन उच्च-डीपीआई मॉनीटर दूर नहीं जा रहे हैं। –

+1

@ हंसपैसेंट एचएम, ठीक है। तब मैं कुछ और नहीं कर सकता हूं, क्या मैं सही हूँ? यदि ऐसा है, तो मैं अपने आवेदन को पूरी तरह से डीपीआई-जागरूक बनाने की कोशिश करूंगा। –

उत्तर

1

इसे आज़माएं, जो शार्पवी लाइब्रेरी में पाई जाती है। यह संकल्प पैमाने पर ध्यान दिए बिना उपकरणों पर अच्छी तरह से काम करता है। और मैंने सतह 3 पर 150% पर इसका परीक्षण किया है।

SharpAVI यहां पाया जा सकता: https://github.com/baSSiLL/SharpAvi यह वीडियो के लिए है, लेकिन एक समान copyFromScreen विधि जब प्रत्येक फ्रेम हो रही उपयोग करता है:

graphics.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size(screenWidth, screenHeight)); 
+1

यकीन नहीं है कि मुझे यहां एक वोट क्यों मिला। वर्तमान में ऐप मेनिफेस्ट में प्रवेश जोड़ने के बिना 1 से ऊपर स्केल फैक्टर पर एक स्क्रीनशॉट प्राप्त करने में सक्षम है। – ickydime

संबंधित मुद्दे