C# WinForms Bitmap保存图片画质极差,如何优化?
解决Bitmap保存后画质下降的问题
方案1:直接保存PictureBox中的原始图像
通过DrawToBitmap从控件渲染图像会引入画质损失,因为它捕获的是控件的显示状态(可能经过缩放、低质量插值处理)。直接使用PictureBox的Image属性保存原始图像数据,是最可靠的保画质方式:
// 保存为无损PNG格式 pageImage.Image.Save(originalLocation, System.Drawing.Imaging.ImageFormat.Png); // 若需保存为JPEG并设置最高画质 var qualityParams = new System.Drawing.Imaging.EncoderParameters(1); qualityParams.Param[0] = new System.Drawing.Imaging.EncoderParameter( System.Drawing.Imaging.Encoder.Quality, 100L); var jpegCodec = ImageCodecInfo.GetImageEncoders() .First(codec => codec.FormatID == System.Drawing.Imaging.ImageFormat.Jpeg.Guid); pageImage.Image.Save(originalLocation, jpegCodec, qualityParams);
方案2:优化DrawToBitmap的渲染参数
如果必须从控件渲染(比如控件上叠加了自定义绘制内容),需要在绘制时配置高质量渲染选项,减少画质损耗:
using (Bitmap bmp = new Bitmap(pageImage.Width, pageImage.Height)) { using (Graphics g = Graphics.FromImage(bmp)) { // 开启高质量渲染模式 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; pageImage.DrawToBitmap(bmp, new Rectangle(0, 0, pageImage.Width, pageImage.Height)); } // 优先选择无损格式保存 bmp.Save(originalLocation, System.Drawing.Imaging.ImageFormat.Png); }
方案3:修正PictureBox的缩放模式
如果PictureBox的SizeMode设置为StretchImage、Zoom等缩放模式,控件会自动缩放图像导致画质下降。可以临时切换为原始尺寸模式后再渲染:
var originalSizeMode = pageImage.SizeMode; pageImage.SizeMode = PictureBoxSizeMode.Normal; using (Bitmap bmp = new Bitmap(pageImage.Width, pageImage.Height)) { pageImage.DrawToBitmap(bmp, new Rectangle(0, 0, pageImage.Width, pageImage.Height)); bmp.Save(originalLocation, System.Drawing.Imaging.ImageFormat.Png); } pageImage.SizeMode = originalSizeMode;
内容的提问来源于stack exchange,提问作者Silme94
相关产品推荐
相关产品推荐

