using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; namespace DeviceAgent.Services; /// /// 屏幕截图服务 /// public class ScreenCaptureService { private readonly ILogger _logger; public ScreenCaptureService(ILogger logger) { _logger = logger; } /// /// 截取屏幕并返回 JPEG 字节数组 /// /// JPEG 质量 (1-100) /// 最大宽度(用于缩略图) public byte[] CaptureScreen(int quality = 50, int maxWidth = 800) { try { // 获取主屏幕尺寸 var screenWidth = GetSystemMetrics(SM_CXSCREEN); var screenHeight = GetSystemMetrics(SM_CYSCREEN); using var bitmap = new Bitmap(screenWidth, screenHeight, PixelFormat.Format24bppRgb); using var graphics = Graphics.FromImage(bitmap); // 截取整个屏幕 graphics.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight)); // 计算缩放后的尺寸 var scale = Math.Min(1.0, (double)maxWidth / screenWidth); var newWidth = (int)(screenWidth * scale); var newHeight = (int)(screenHeight * scale); // 缩放图片 using var resized = new Bitmap(newWidth, newHeight); using var resizeGraphics = Graphics.FromImage(resized); resizeGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; resizeGraphics.DrawImage(bitmap, 0, 0, newWidth, newHeight); // 转换为 JPEG using var ms = new MemoryStream(); var encoder = GetEncoder(ImageFormat.Jpeg); var encoderParams = new EncoderParameters(1); encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, (long)quality); resized.Save(ms, encoder, encoderParams); return ms.ToArray(); } catch (Exception ex) { _logger.LogError(ex, "屏幕截图失败"); return Array.Empty(); } } /// /// 截取屏幕并返回 Base64 字符串 /// public string CaptureScreenBase64(int quality = 50, int maxWidth = 800) { var bytes = CaptureScreen(quality, maxWidth); return bytes.Length > 0 ? Convert.ToBase64String(bytes) : string.Empty; } private static ImageCodecInfo GetEncoder(ImageFormat format) { var codecs = ImageCodecInfo.GetImageEncoders(); return codecs.First(c => c.FormatID == format.Guid); } // Windows API private const int SM_CXSCREEN = 0; private const int SM_CYSCREEN = 1; [DllImport("user32.dll")] private static extern int GetSystemMetrics(int nIndex); }