Nghệ thuật nếu không có kỹ thuật chỉ là giấc mơ, kỹ thuật không bao gồm nghệ thuật thì chỉ là giải toán. Steven K Robert
Vũ Quang Huy Hướng dẫn bạn đọc viết một ứng dụng bằng C# thực hiện thao tác chụp ảnh màn hình và tự động lưu lại theo định dạng chọn trước trong 5 bước. Ứng dụng có thể mở rộng thành một dịch vụ chạy ngầm của hệ thống và được kích hoạt với một tổ hợp phím quy định trước.
Nội dung bài viết

Giới thiệu

Thông thường, để chụp lại màn hình làm việc hiện tại, ta hay sử dụng phím Print Screen. Bức ảnh chụp xong sẽ được lưu vào trong bộ nhớ và ta phải dùng Paint hay một ứng dụng của hãng thứ 3 để có thể lưu lại bức ảnh vừa chụp. Khi công việc yêu cầu phải chụp màn hình lại nhiều lần – ví dụ như viết tài liệu mô tả, việc lặp đi lặp lại các thao tác này sẽ tốn nhiều công sức.

Vì vậy, bài viết này hướng dẫn bạn đọc viết một ứng dụng bằng C# có khả năng chụp ảnh màn hình và lưu lại tức thì chỉ trong 5 bước.

Xây dựng ứng dụng

Ta bắt tay vào việc xây dựng ứng dụng bằng bước đầu tiên là khởi tạo một project C# trống, loại ứng dụng là Console và đặt tên cho project này là STDIO_ScreenCapture.

ss_1
 
Project sau khi khởi tạo có nội dung như bên dưới.

ss_2
 
Ta bắt tay vào xây dựng ứng dụng với 5 bước

Bước 1: Khai báo đối tượng Bitmap và Graphic

Mặc định, project được tạo dưới dạng Console Application sẽ không tham chiếu đến thư viện System.Drawing. Do đó, chương trình sẽ báo lỗi nếu ta cố tình thêm đối tượng Bitmap.

Để khắc phục vấn đề này, tại cửa sổ Solution Explorer

  • Click phải vào References > Add Reference …
  • Tại mục Framework, trong danh sách các thư viện khả dụng, ta tick chọn System.Drawing
  • Chọn OK để hoàn tất việc thêm thư viện tham chiếu.

ss_3 

Sau đó, ta khai báo với chương trình sẽ sử dụng thư viện System.Drawing

using System.Drawing;

Và khai báo 2 đối tượng Bitmap, Graphics trong lớp Program

private static Bitmap screenBitmap;
private static Graphics screenGraphics;

Bước 2: Tạo hộp thoại xác nhận việc lưu ảnh

Hộp thoại trong trường hợp này ta sử dụng là SaveFileDialog thuộc thư viện System.Windows.Forms. Ta cần phải tham chiếu thư đến thư viện này nếu muốn sử dụng đối tượng SaveFileDialog. Về cách thêm một thư viện bạn đọc có thể tham khảo bên trên.

Trong hàm main, ta tiến hành tạo đối tượng dialog và hiển thị lên. Hộp thoại này sẽ trả về cho ta kiểu DialogResult và trong bài viết này, ta chỉ xử lý nếu người dùng chọn OK.

SaveFileDialog saveDialog = new SaveFileDialog();

// Set filter options and filter index.
saveDialog.Filter = "PNG Files (.png)|*.png|All Files (*.*)|*.*";
saveDialog.FilterIndex = 1;

if (saveDialog.ShowDialog() == DialogResult.OK)
{
}

Biên dịch và chạy thử chương trình, hộp thoại save hiện lên như hình bên dưới

ss_4
 
Lưu ý nếu chương trình văng ThreadStateException thì ta thêm chỉ dẫn [STAThread] ngay trước hàm main.

[STAThread]
static void Main(string[] args)

Bước 3: Khởi tạo đối tượng Bitmap và Graphics

Ta quy định hai đối tượng này được khởi tạo khi và chỉ khi người dùng chọn đồng ý lưu file. Đối tượng Bitmap được tạo ra có kích thước bằng với kích thước màn hình hiện hành.

Đoạn code này được thêm vào sau phần ta kiểm tra kết quả trả về của dialog là OK.

screenBitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
                            Screen.PrimaryScreen.Bounds.Height, 
                            PixelFormat.Format32bppArgb);                
screenGraphics = Graphics.FromImage(screenBitmap);

Bước 4:  Lưu ảnh màn hình vào đối tượng Bitmap

Thao tác này được thực hiện với dòng code sau

screenGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 
                        0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);

Bước 5: Xuất nội dung được lưu ra file

Từ đối tượng Bitmap, ta gọi phương thức Save với 2 tham số:

  • string filename: đường dẫn lưu file, có thể lấy thông qua đối tượng SaveFileDialog
  • ImageFormat format: định dạng ảnh muốn lưu, trong bài viết này ta chọn PNG
screenBitmap.Save(saveDialog.FileName, ImageFormat.Png);

Code hoàn chỉnh của chương trình:

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

namespace STDIO_ScreenCapture
{
    class Program
    {
        private static Bitmap screenBitmap;
        private static Graphics screenGraphics;

        [STAThread]
        static void Main(string[] args)
        {
            SaveFileDialog saveDialog = new SaveFileDialog();
            // Set filter options and filter index.
            saveDialog.Filter = "PNG Files (.png)|*.png|All Files (*.*)|*.*";
            saveDialog.FilterIndex = 1;

            if (saveDialog.ShowDialog() == DialogResult.OK)
            {
                screenBitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
                                            Screen.PrimaryScreen.Bounds.Height, 
                                            PixelFormat.Format32bppArgb);                
                screenGraphics = Graphics.FromImage(screenBitmap);
                screenGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 
                                        0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
                screenBitmap.Save(saveDialog.FileName, ImageFormat.Png);
            }
        }
    }
}

Khả năng mở rộng

Để thuận tiện hơn cho việc sử dụng, ta có thể xây dựng ứng dụng này thành một service chạy ngầm và thao tác chụp ảnh màn hình chỉ được kích hoạt khi người dùng ấn một tổ hợp phím ta đã quy định từ trước. Ngoài ra, ta có thể xây dựng cơ chế đánh tên ảnh tự động ví dụ như ss_1.png, ss_2.png … và cho phép người dùng chọn nơi lưu toàn bộ các screenshot này.

Download ứng dụng mẫu

Ứng dụng được tôi thực hiện trên Windows 8.1 Pro (64-bit) dùng Visual Studio 2013 Community với .NET Framework 4.5.

STDIO_ScreenCapture_VS2013.zip

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG