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

如何裁剪Bitmap并保存时保留原图清晰度?

如何在裁剪并保存Bitmap时保留原图清晰度

问题描述

裁剪Bitmap图像后,保存的结果清晰度下降,需要实现裁剪后保留原图的清晰度。

变量说明

temp = 临时Bitmap图像
varas.ptval = 原始图像

效果对比

  • 当前裁剪结果:图像模糊,细节丢失
  • 期望效果:图像清晰,细节完整

当前代码

Bitmap temp;
Bitmap croped;
Rectangle rectangle = new Rectangle();
rectangle.Height = varas.Rect_H;
rectangle.Width = varas.Rect_W;
rectangle.X = varas.Rect_X;
rectangle.Y = varas.Rect_Y;
temp = varas.ptval;
croped = cropBitmap(temp, rectangle);
varas.RGBcrop = croped;
croped.Save(paths + "\\" + "SPR_" + ".jpeg", ImageFormat.Jpeg);

解决方案

清晰度下降主要来自两个方面:裁剪方法的不合理处理,以及JPEG保存时的默认低质量压缩。以下是针对性的解决步骤:

1. 实现正确的高质量裁剪方法

确保裁剪时直接从原图截取像素,不进行不必要的缩放,同时设置图形绘制的高质量参数:

private Bitmap cropBitmap(Bitmap original, Rectangle rect)
{
    // 确保裁剪区域在原图范围内,避免异常
    if (rect.X < 0 || rect.Y < 0 || rect.X + rect.Width > original.Width || rect.Y + rect.Height > original.Height)
    {
        throw new ArgumentOutOfRangeException("裁剪区域超出原图范围");
    }

    // 创建与原图像素格式一致的裁剪Bitmap,避免格式转换损失
    Bitmap cropped = new Bitmap(rect.Width, rect.Height, original.PixelFormat);
    
    using (Graphics g = Graphics.FromImage(cropped))
    {
        // 设置高质量图形参数,确保像素复制的准确性
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; // 不需要平滑,避免模糊
        
        // 将原图的裁剪区域绘制到新Bitmap上
        g.DrawImage(original, new Rectangle(0, 0, rect.Width, rect.Height), rect, GraphicsUnit.Pixel);
    }
    
    return cropped;
}

2. 以最高质量保存JPEG

默认JPEG保存的质量较低,需要手动指定最高质量参数:

// 准备JPEG质量参数(100为最高质量,范围0-100)
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);

// 获取JPEG图像编码器
ImageCodecInfo jpegCodec = ImageCodecInfo.GetImageEncoders()
    .FirstOrDefault(codec => codec.FormatID == ImageFormat.Jpeg.Guid);

// 使用高质量参数保存
croped.Save(paths + "\\SPR_.jpeg", jpegCodec, encoderParams);

额外注意事项

  • 确认rectangle的坐标和尺寸完全正确,避免因区域错误导致的拉伸或像素丢失。
  • 避免对原始Bitmap进行多次不必要的复制或格式转换,减少质量损失的环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:30:11