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

如何降低Bitmap分辨率、减小体积并提升游戏截图的保存速度?

解决方案

1. 先缩小画面分辨率再编码

游戏截图通常分辨率较高(如2K/4K),直接编码大尺寸Bitmap时,即便降低JPEG质量,编码计算量仍居高不下。先将截图缩小至合适尺寸,能大幅削减编码时间与文件体积。

示例代码:

// 将原Bitmap缩小至1/2尺寸,可根据需求调整比例
int targetWidth = frame.Bitmap.Width / 2;
int targetHeight = frame.Bitmap.Height / 2;
using var resizedBitmap = new Bitmap(targetWidth, targetHeight);
using var g = Graphics.FromImage(resizedBitmap);
// 使用低插值模式提升缩放速度
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
g.DrawImage(frame.Bitmap, 0, 0, targetWidth, targetHeight);

// 保存缩小后的图片
using var ms = new MemoryStream();
SaveBitmapWithQuality(resizedBitmap, 10, ms);
var bytes = ms.ToArray();

2. 改用WebP格式替代JPEG

WebP在低质量场景下的编码速度比JPEG更快,同时文件体积更小。.NET Core 3.0及以上版本原生支持WebP格式,无需额外依赖库。

示例代码:

// 静态缓存WebP编码器,避免重复查询开销
private static readonly ImageCodecInfo WebpEncoder = ImageCodecInfo.GetImageDecoders()
    .First(codec => codec.FormatID == ImageFormat.Webp.Guid);

static void SaveBitmapAsWebp(Bitmap bitmap, int quality, MemoryStream outputStream)
{
    if (quality is < 0 or > 100)
        throw new ArgumentOutOfRangeException(nameof(quality), "quality must be in [0..100].");

    using var encoderParams = new EncoderParameters(1);
    encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality);
    bitmap.Save(outputStream, WebpEncoder, encoderParams);
}

// 调用方式
using var ms = new MemoryStream();
SaveBitmapAsWebp(frame.Bitmap, 10, ms);
var bytes = ms.ToArray();

3. 缓存编码器实例,避免重复查询

你当前的代码每次调用SaveBitmapWithQuality都会执行ImageCodecInfo.GetImageDecoders().Where(...),该方法开销极大。将编码器缓存为静态变量,仅查询一次即可:

优化后的代码:

// 静态缓存JPEG编码器
private static readonly ImageCodecInfo JpegEncoder = ImageCodecInfo.GetImageDecoders()
    .Single(codec => codec.FormatID == ImageFormat.Jpeg.Guid);

static void SaveBitmapWithQuality(Bitmap bitmap, int quality, MemoryStream outputStream)
{
    if (quality is < 0 or > 100)
    {
        throw new ArgumentOutOfRangeException(nameof(quality), "quality must be in [0..100].");
    }

    var qualityEncoder = Encoder.Quality;
    using var encoderParams = new EncoderParameters(1);
    encoderParams.Param[0] = new EncoderParameter(qualityEncoder, quality);
    bitmap.Save(outputStream, JpegEncoder, encoderParams);
}

4. 使用硬件加速编码

若以上方法仍无法满足需求,可考虑利用硬件加速编码能力(如NVIDIA NVENC、Intel Quick Sync),编码速度能比软件编码快数倍。可通过FFmpeg.AutoGen或SharpDX等库调用系统硬件加速接口,核心思路是将Bitmap数据传入硬件编码器,跳过软件编码的大量计算开销。


内容的提问来源于stack exchange,提问作者Aloex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:22:44