87 lines
2.9 KiB
C#
87 lines
2.9 KiB
C#
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace DeviceAgent.Services;
|
|
|
|
/// <summary>
|
|
/// 屏幕截图服务
|
|
/// </summary>
|
|
public class ScreenCaptureService
|
|
{
|
|
private readonly ILogger<ScreenCaptureService> _logger;
|
|
|
|
public ScreenCaptureService(ILogger<ScreenCaptureService> logger)
|
|
{
|
|
_logger = logger;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 截取屏幕并返回 JPEG 字节数组
|
|
/// </summary>
|
|
/// <param name="quality">JPEG 质量 (1-100)</param>
|
|
/// <param name="maxWidth">最大宽度(用于缩略图)</param>
|
|
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<byte>();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 截取屏幕并返回 Base64 字符串
|
|
/// </summary>
|
|
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);
|
|
}
|