如何在C#中捕获全屏并调整Bitmap分辨率?
解决方案
要实现捕获全屏后降低分辨率生成Base64,核心是先完整捕获屏幕,再将原图缩放到目标尺寸,而非直接创建小尺寸画布截取局部。以下是可直接使用的代码:
using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; public static class ScreenshotHelper { public static string TakeScreenshotToBase64(int targetWidth, int targetHeight, int jpegQuality = 80) { // 1. 捕获完整屏幕 var screenBounds = Screen.PrimaryScreen.Bounds; using (var fullScreenBmp = new Bitmap(screenBounds.Width, screenBounds.Height)) using (var g = Graphics.FromImage(fullScreenBmp)) { g.CopyFromScreen(screenBounds.X, screenBounds.Y, 0, 0, screenBounds.Size); // 2. 创建缩放后的Bitmap using (var resizedBmp = new Bitmap(targetWidth, targetHeight)) using (var resizeG = Graphics.FromImage(resizedBmp)) { // 设置插值模式,优化缩放后的画质 resizeG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; resizeG.DrawImage(fullScreenBmp, 0, 0, targetWidth, targetHeight); // 3. 保存为JPEG(可调整质量进一步压缩体积) using (var ms = new MemoryStream()) { var jpegParams = new EncoderParameters(1); jpegParams.Param[0] = new EncoderParameter(Encoder.Quality, jpegQuality); var jpegCodec = GetEncoder(ImageFormat.Jpeg); resizedBmp.Save(ms, jpegCodec, jpegParams); return Convert.ToBase64String(ms.ToArray()); } } } } // 辅助方法:获取JPEG编码器 private static ImageCodecInfo GetEncoder(ImageFormat format) { var codecs = ImageCodecInfo.GetImageDecoders(); foreach (var codec in codecs) { if (codec.FormatID == format.Guid) { return codec; } } return null; } }
关键说明:
- 捕获全屏:先基于屏幕完整尺寸创建Bitmap,确保捕获到整个屏幕内容。
- 缩放处理:通过
Graphics.DrawImage将全屏Bitmap绘制到目标尺寸的新Bitmap上,设置InterpolationMode保证缩放后的画质不会过于模糊。 - JPEG质量调整:通过
EncoderParameter设置JPEG质量(范围0-100),值越小体积越小,可根据需求平衡画质和体积。 - 资源释放:所有实现
IDisposable的对象(Bitmap、Graphics、MemoryStream)都用using包裹,避免内存泄漏。
使用示例:
// 缩放到原屏幕的一半尺寸,JPEG质量设为70 string base64 = ScreenshotHelper.TakeScreenshotToBase64( Screen.PrimaryScreen.Bounds.Width / 2, Screen.PrimaryScreen.Bounds.Height / 2, 70);
内容的提问来源于stack exchange,提问作者Doomed
相关产品推荐
相关产品推荐

