گرفتن اسکرین شات در سیشارپ
در برنامهنویسی، یکی از نیازهای متداول، گرفتن تصویر از صفحهنمایش یا بخشی خاص از آن است. در زبان سیشارپ (C#)، این کار بهراحتی و با استفاده از کتابخانههای مختلف امکانپذیر است. در این مقاله، بهطور جامع و کامل، روشهای مختلف برای
گرفتن اسکرین شات در سیشارپ
را شرح میدهیم، از مفاهیم پایه گرفته تا نکات پیشرفته و نمونههای عملی.مقدمهای بر
گرفتن اسکرین شات در سیشارپ
در واقع، گرفتن اسکرین شات، فرآیندی است که تصویر صفحهنمایش یا ناحیهای خاص را بهصورت یک فایل تصویری ذخیره میکند. این عملیات در برنامههای مختلف، از جمله ابزارهای صفحهنگاری، برنامههای ضبط صفحه، نرمافزارهای تست و توسعه، و حتی بازیهای ویدیویی کاربرد دارد. در زبان سیشارپ، این قابلیت با استفاده از کلاسها و متدهای موجود در فضای نام `System.Drawing` و `System.Windows.Forms` بهسادگی قابل اجرا است.
کتابخانههای مورد نیاز و مفاهیم پایه
برای شروع، نیاز است که پروژهتان به ارجاعات زیر مجهز باشد:
- `System.Drawing`
- `System.Windows.Forms`
این دو کتابخانه، امکانات لازم برای گرفتن تصویر از صفحه و ذخیرهسازی آن را فراهم میکنند. در صورتیکه در پروژه خود، این ارجاعات فعال نیست، باید آنها را اضافه کنید. همچنین، توجه کنید که در پروژههای جدید، ممکن است نیاز باشد کتابخانههای مربوط به Windows Forms را به صورت جداگانه نصب کنید، بهخصوص در پروژههای نوع .NET Core یا .NET 5/6.
گرفتن اسکرین شات از صفحه کامل
یکی از سادهترین روشها، استفاده از کلاس `Graphics` است. فرض کنید میخواهید از کل صفحهنمایش، یک تصویر بگیرید. در این حالت، باید ابعاد صفحهنمایش را بدست آورید و سپس تصویر آن را ذخیره کنید.
در ادامه، نمونه کد کامل و توضیحات آن آورده شده است:
csharp
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
public class ScreenCapture
{
public static void CaptureFullScreen(string savePath)
{
// ابعاد صفحهنمایش را بگیرید
Rectangle bounds = Screen.PrimaryScreen.Bounds;
// ایجاد یک شی Bitmap با ابعاد صفحه
using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
{
// ایجاد یک شی Graphics برای کشیدن بر روی Bitmap
using (Graphics g = Graphics.FromImage(bitmap))
{
// کشیدن صفحهنمایش بر روی Bitmap
g.CopyFromScreen(bounds.Location, Point.Empty, bounds.Size);
}
// ذخیره تصویر در مسیر مشخص شده
bitmap.Save(savePath, ImageFormat.Png);
}
}
}
در این کد، ابتدا ابعاد صفحهنمایش اصلی (`PrimaryScreen`) گرفته میشود. سپس، یک شی `Bitmap` ساخته میشود که اندازه آن مطابق با ابعاد صفحه است. با استفاده از `Graphics.FromImage()`, عملیات کشیدن تصویر صفحه به داخل این `Bitmap` انجام میشود، و در نهایت، تصویر در مسیر مشخص شده ذخیره میگردد.
گرفتن اسکرین شات از بخش خاصی از صفحه
گاهی اوقات نیاز است فقط ناحیهای خاص از صفحه را ضبط کنید، مثلا بخشی از برنامه یا پنجرهای مشخص. برای این کار، باید مختصات ناحیه مورد نظر را تعیین کنید و عملیات مشابه قبل را انجام دهید، اما به جای کل صفحه، فقط همان ناحیه را در نظر بگیرید.
نمونه کد برای این منظور:
csharp
public static void CaptureRegion(Rectangle region, string savePath)
{
using (Bitmap bitmap = new Bitmap(region.Width, region.Height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
// کشیدن ناحیه مخصوص بر روی Bitmap
g.CopyFromScreen(region.Location, Point.Empty, region.Size);
}
bitmap.Save(savePath, ImageFormat.Png);
}
}
در این حالت، باید منطقه مورد نظر را به صورت شی `Rectangle` تعریف کنید، مثلا:
csharp
Rectangle region = new Rectangle(100, 200, 300, 400);
و سپس این منطقه را به تابع `CaptureRegion` پاس دهید.
گرفتن اسکرین شات از پنجرههای خاص
در برخی موارد، لازم است تصویر یک پنجره خاص یا کنترل خاص در برنامه را بگیرید. این کار کمی پیچیدهتر است، اما ممکن است با استفاده از APIهای ویندوز و توابع Win32 انجام شود. برای مثال، میتوانید با استفاده از تابع `GetWindowRect`، مختصات پنجره مورد نظر را دریافت کرده و سپس همان روشهای قبل را برای گرفتن تصویر استفاده کنید.
یک نمونه ساده:
csharp
using System.Runtime.InteropServices;
public class WindowCapture
{
[DllImport("user32.dll")]
public static extern bool GetWindowRect(IntPtr hWnd, out RECT rect);
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
public static void CaptureWindow(IntPtr hWnd, string savePath)
{
RECT rect;
if (GetWindowRect(hWnd, out rect))
{
int width = rect.Right - rect.Left;
int height = rect.Bottom - rect.Top;
Rectangle region = new Rectangle(rect.Left, rect.Top, width, height);
using (Bitmap bitmap = new Bitmap(width, height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(region.Location, Point.Empty, region.Size);
}
bitmap.Save(savePath, ImageFormat.Png);
}
}
}
}
در این نمونه، باید شناسه پنجره را دریافت کنید، مثلا با استفاده از توابع دیگر API، و سپس آن را به تابع `CaptureWindow` پاس دهید.
ذخیرهسازی تصویر در قالبهای مختلف
در مثالهای بالا، تصویر در قالب PNG ذخیره شد. اما میتوانید آن را در قالبهای دیگر مانند JPEG، BMP، TIFF و GIF نیز ذخیره کنید. کافی است در هنگام ذخیرهسازی، نوع فرمت مورد نظر را تعیین کنید:
csharp
bitmap.Save("path.jpg", ImageFormat.Jpeg);
همچنین، میتوانید کیفیت تصویر را تنظیم کنید، هرچند این موضوع در JPEG مهم است و نیازمند استفاده از کلاسهای پیشرفتهتر است.
نکات مهم و موارد کاربردی
- حتما از استفاده داخل `using` برای اشیای `Bitmap` و `Graphics` اطمینان حاصل کنید، زیرا این اشیا منابع زیادی مصرف میکنند.
- در پروژههای چندنخی، مراقب باشید که عملیات تصویربرداری در thread مناسب انجام شود.
- در برنامههایی که نیازمند گرفتن مداوم اسکرین شات هستند، بهتر است عملیات را در یک حلقه قرار دهید و با فاصله زمانی مشخص اجرا کنید.
- برای برنامههای حرفهای، ممکن است نیاز به گرفتن تصویر از پنجرههای غیر فعال یا مخفی داشته باشید، که این نیاز به APIهای پیچیدهتر دارد.
جمعبندی
در این مقاله، بهطور جامع و کامل، روشهای مختلف برای