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);
}