You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 06:39:17