如何降低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
相关产品推荐
相关产品推荐

