"

گرفتن عکس از صفحه در سی شارپ,گرفتن از کل صفحه با Graphics.CopyFromScreen در سی شارپ,گرفتن از صفحه فعلی (در برنامه‌های WinForms) در سی شارپ

گرفتن عکس از صفحه در سی شارپ

گرفتن عکس از صفحه در سی شارپ با Graphics.CopyFromScreen، ساخت Bitmap به ابعاد صفحه، ذخیره به PNG/JPEG و مدیریت حافظه با using.

تیم تحریریه
7
0
01 خرداد 1405
لینک کوتاه

گرفتن عکس از صفحه در سی شارپ

برای گرفتن عکس از صفحه در سی شارپ، ساده‌ترین روش استفاده از کلاس Graphics و متد CopyFromScreen در فضای نام System.Drawing است.
ابتدا باید ابعاد صفحه را با Screen.PrimaryScreen.Bounds دریافت کنید، سپس یک شیء Bitmap به همان ابعاد ایجاد کرده و با فراخوانی Graphics.FromImage و اجرای CopyFromScreen، محتوای صفحه روی بیت‌مپ کپی می‌شود.
در نهایت با متد Save می‌توان تصویر را در فرمت‌های PNG، JPEG یا BMP ذخیره کرد.
این روش برای برنامه‌های ویندوز فرم (WinForms) بسیار مناسب است و با کمتر از ۱۰ خط کد قابل پیاده‌سازی می‌باشد.
در برنامه‌های WPF به دلیل نبود دسترسی مستقیم به Graphics.CopyFromScreen، باید از RenderTargetBitmap استفاده کرد.
با این روش می‌توان از محتوای هر کنترل یا پنجره WPF عکس گرفت.
همچنین برای گرفتن اسکرین‌شات از پنجره‌های خاص (حتی پنجره‌های پس‌زمینه)، می‌توان از توابع Windows API مانند PrintWindow و GetWindowRect از کتابخانه user32.dll بهره برد.
در همه روش‌ها، رعایت مدیریت حافظه با استفاده از عبارت using برای آزادسازی خودکار منابع Bitmap و Graphics ضروری است تا از نشتی حافظه جلوگیری شود.




گرفتن عکس از صفحه در سی شارپ



گرفتن از کل صفحه با Graphics.CopyFromScreen در سی شارپ

ساده‌ترین روش برای گرفتن اسکرین‌شات، استفاده از کلاس Graphics و متد CopyFromScreen است.

کد کامل:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

public static class ScreenCapturer
{
    public static Bitmap CaptureFullScreen()
    {
        // گرفتن ابعاد تمام صفحه
        Rectangle bounds = Screen.PrimaryScreen.Bounds;
        
        // ایجاد بیت‌مپ با ابعاد صفحه
        Bitmap screenshot = new Bitmap(bounds.Width, bounds.Height);
        
        // ایجاد شیء Graphics از بیت‌مپ
        using (Graphics graphics = Graphics.FromImage(screenshot))
        {
            // کپی کردن از صفحه به بیت‌مپ
            graphics.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size);
        }
        
        return screenshot;
    }
}

// نحوه استفاده
// Bitmap img = ScreenCapturer.CaptureFullScreen();
// img.Save("screenshot.png", ImageFormat.Png);






آیا به دنبال یک فرصت عالی برای یادگیری برنامه‌نویسی هستید؟ 🚀

با دوره آموزشی سی‌شارپ ما، شما می‌توانید مهارت‌های خود را به سطح جدیدی ارتقا دهید! این دوره به‌طور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامه‌نویسی سی‌شارپ پیش بروید.

👨‍🏫 چرا دوره ما را انتخاب کنید؟

  • محتوای جامع و عملی: با پروژه‌های واقعی و تمرینات عملی، یادگیری را به تجربه‌ای جذاب تبدیل کنید.
  • مدرس مجرب: از تجربه و دانش مدرس حرفه‌ای بهره‌مند شوید که شما را در هر مرحله از یادگیری راهنمایی می‌کنند.
  • پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
  • دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، می‌توانید به آن مراجعه کنید.

💡 فرصت را از دست ندهید!

بایادگیری سی‌شارپ، می‌توانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژه‌های جذاب و چالش‌برانگیز شرکت کنید.

همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده‌ای روشن‌تر بردارید!

شرکت در دوره آموزش برنامه نویسی سی شارپ







گرفتن از صفحه فعلی (در برنامه‌های WinForms) در سی شارپ

اگر فقط می‌خواهید از فرم یا کنترل خاصی عکس بگیرید:


public static Bitmap CaptureForm(Form form)
{
    Bitmap bitmap = new Bitmap(form.Width, form.Height);
    form.DrawToBitmap(bitmap, new Rectangle(0, 0, form.Width, form.Height));
    return bitmap;
}

public static Bitmap CaptureControl(Control control)
{
    Bitmap bitmap = new Bitmap(control.Width, control.Height);
    control.DrawToBitmap(bitmap, new Rectangle(0, 0, control.Width, control.Height));
    return bitmap;
}

گرفتن عکس از چند مانیتور در سی شارپ

در سیستم‌هایی با چند مانیتور، باید همه مانیتورها را در نظر گرفت:


public static Bitmap CaptureAllScreens()
{
    // محاسبه مجموع ابعاد همه مانیتورها
    int totalWidth = 0;
    int totalHeight = 0;
    
    foreach (Screen screen in Screen.AllScreens)
    {
        totalWidth = Math.Max(totalWidth, screen.Bounds.Right);
        totalHeight = Math.Max(totalHeight, screen.Bounds.Bottom);
    }
    
    Rectangle allScreensBounds = new Rectangle(0, 0, totalWidth, totalHeight);
    Bitmap screenshot = new Bitmap(totalWidth, totalHeight);
    
    using (Graphics graphics = Graphics.FromImage(screenshot))
    {
        graphics.CopyFromScreen(allScreensBounds.X, allScreensBounds.Y, 0, 0, allScreensBounds.Size);
    }
    
    return screenshot;
}

روش پیشرفته با استفاده از Windows API (برای پنجره خاص)  در سی شارپ

برای گرفتن اسکرین‌شات از یک پنجره خاص (حتی اگر در پس‌زمینه باشد) می‌توان از Windows API استفاده کرد:


using System.Runtime.InteropServices;

public class WindowCapture
{
    [DllImport("user32.dll")]
    private static extern IntPtr GetDesktopWindow();
    
    [DllImport("user32.dll")]
    private static extern IntPtr GetWindowDC(IntPtr hWnd);
    
    [DllImport("user32.dll")]
    private static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
    
    [DllImport("user32.dll")]
    private static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);
    
    public static Bitmap CaptureWindow(IntPtr handle)
    {
        // گرفتن ابعاد پنجره
        RECT rect = new RECT();
        GetWindowRect(handle, ref rect);
        
        int width = rect.Right - rect.Left;
        int height = rect.Bottom - rect.Top;
        
        Bitmap bitmap = new Bitmap(width, height);
        using (Graphics graphics = Graphics.FromImage(bitmap))
        {
            IntPtr hdc = graphics.GetHdc();
            PrintWindow(handle, hdc, 0);
            graphics.ReleaseHdc(hdc);
        }
        
        return bitmap;
    }
    
    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
        public int Left, Top, Right, Bottom;
    }
    
    [DllImport("user32.dll")]
    private static extern bool GetWindowRect(IntPtr hwnd, ref RECT rectangle);
}

روش پیشرفته با استفاده از Windows API (برای پنجره خاص)  در سی شارپ



ذخیره اسکرین‌شات با کیفیت بالا در سی شارپ

ذخیره به فرمت‌های مختلف:

public static void SaveScreenshot(Bitmap screenshot, string path, ImageFormat format)
{
    switch (format)
    {
        case ImageFormat.Png:
            screenshot.Save(path, ImageFormat.Png);
            break;
        case ImageFormat.Jpeg:
            // تنظیم کیفیت JPEG
            var jpegCodec = GetEncoderInfo("image/jpeg");
            var encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 90L);
            screenshot.Save(path, jpegCodec, encoderParams);
            break;
        case ImageFormat.Bmp:
            screenshot.Save(path, ImageFormat.Bmp);
            break;
        default:
            screenshot.Save(path, ImageFormat.Png);
            break;
    }
}

private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
    foreach (var codec in codecs)
        if (codec.MimeType == mimeType)
            return codec;
    return null;
}

برنامه کامل ویندوز فرم با قابلیت ذخیره 


using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

public partial class ScreenshotForm : Form
{
    private Button btnCapture;
    private PictureBox picPreview;
    private SaveFileDialog saveDialog;
    
    public ScreenshotForm()
    {
        InitializeComponent();
        SetupUI();
    }
    
    private void SetupUI()
    {
        this.Text = "Screenshot Tool";
        this.Size = new Size(800, 600);
        
        btnCapture = new Button { Text = "گرفتن اسکرین‌شات", Location = new Point(10, 10), Size = new Size(150, 30) };
        btnCapture.Click += BtnCapture_Click;
        
        picPreview = new PictureBox { Location = new Point(10, 50), Size = new Size(760, 480), BorderStyle = BorderStyle.FixedSingle };
        picPreview.SizeMode = PictureBoxSizeMode.Zoom;
        
        saveDialog = new SaveFileDialog();
        saveDialog.Filter = "PNG Image|*.png|JPEG Image|*.jpg|Bitmap Image|*.bmp";
        
        this.Controls.Add(btnCapture);
        this.Controls.Add(picPreview);
    }
    
    private void BtnCapture_Click(object sender, EventArgs e)
    {
        // پنهان کردن فرم برای اسکرین‌شات تمیز
        this.WindowState = FormWindowState.Minimized;
        System.Threading.Thread.Sleep(500);
        
        Bitmap screenshot = CaptureFullScreen();
        
        // نمایش مجدد فرم
        this.WindowState = FormWindowState.Normal;
        this.BringToFront();
        
        picPreview.Image = screenshot;
        
        if (saveDialog.ShowDialog() == DialogResult.OK)
        {
            string ext = System.IO.Path.GetExtension(saveDialog.FileName).ToLower();
            ImageFormat format = ext switch
            {
                ".jpg" => ImageFormat.Jpeg,
                ".bmp" => ImageFormat.Bmp,
                _ => ImageFormat.Png
            };
            screenshot.Save(saveDialog.FileName, format);
            MessageBox.Show("اسکرین‌شات ذخیره شد!", "موفق", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    
    private Bitmap CaptureFullScreen()
    {
        Rectangle bounds = Screen.PrimaryScreen.Bounds;
        Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size);
        }
        return bitmap;
    }
}

نکات عملکردی و بهینه‌سازی گرفتن عکس از صفحه در سی شارپ

نکته توضیح
Dispose اشیاء گرافیکی همیشه از using برای Graphics و Bitmap استفاده کنید تا حافظه آزاد شود.
کاهش کیفیت  برای عکس‌های حجیم، از فرمت JPEG با کیفیت ۷۰-۸۰٪ استفاده کنید.
گرفتن مکرر   از یک نمونه Bitmap واحد استفاده نکنید؛ هر بار نمونه جدید بسازید.
پردازش همزمان برای گرفتن اسکرین‌شات در حلقه، از Task.Run برای جدا کردن از UI استفاده کنید.
Dependency ارجاع به System.Drawing.Common در پروژه‌های .NET Core/.NET 5+ الزامی است.
    
  
    
  

مثال برای WPF در سی شارپ

در WPF به جای WinForms از این روش استفاده می‌شود:

using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

public static class WpfScreenshot
{
    public static void CaptureAndSave(string filePath)
    {
        double dpiX = 96;
        double dpiY = 96;
        
        var bounds = SystemParameters.PrimaryScreenWidth;
        var height = SystemParameters.PrimaryScreenHeight;
        
        RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
            (int)bounds, (int)height, dpiX, dpiY, PixelFormats.Pbgra32);
        
        renderBitmap.Render(Application.Current.MainWindow);
        
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
        
        using (var stream = System.IO.File.Create(filePath))
        {
            encoder.Save(stream);
        }
    }
}

نتیجه‌گیری

گرفتن اسکرین‌شات در سی شارپ با استفاده از Graphics.CopyFromScreen ساده و کارآمد است. بسته به نیاز می‌توانید:

از کل صفحه، پنجره خاص یا کنترل جداگانه عکس بگیرید.

خروجی را در فرمت‌های مختلف (PNG، JPEG، BMP) ذخیره کنید.

از Windows API برای دسترسی به پنجره‌های پس‌زمینه استفاده کنید.

در WinForms یا WPF به روش مناسب پیاده‌سازی کنید.

با رعایت نکات مدیریت حافظه، می‌توانید ابزار قدرتمند و پایداری برای ثبت تصویر صفحه ایجاد کنید.

محصولات مرتبط

کاربران ما

شما هم نظرتون با ما دریاره “گرفتن عکس از صفحه در سی شارپ” اشتراک بزارید

برای ارسال نظر لطفا ورود یا ثبت نام کنید

منو