C# System.Drawing.Graphics 画图后,如何保存一个低质量的图片,一个占用空间较小的图片

首先要控制图片保存后硬盘后的大小(即占用硬盘的空间,而非尺寸),真正要处理的是控制 System.Drawing.Bitmap.Save 方法的参数。

具体实现如下:

private void ThumbPicture(Image SourceImage, int TargetWidth,string savePath)
        {
            int IntWidth; //新的图片宽
            int IntHeight; //新的图片高
            try
            {
                int TargetHeight = (int)Math.Round(TargetWidth / (SourceImage.Width * 1.0f / SourceImage.Height));
                if (TargetWidth * TargetHeight >= SourceImage.Width * SourceImage.Height)
                {
                    SourceImage.Save(savePath);
                    SourceImage.Dispose();
                    return;
                }
                //计算缩放图片的大小
                if (SourceImage.Width > TargetWidth && SourceImage.Height <= TargetHeight)//宽度比目的图片宽度大,长度比目的图片长度小
                {
                    IntWidth = TargetWidth;
                    IntHeight = (IntWidth * SourceImage.Height) / SourceImage.Width;
                }
                else if (SourceImage.Width <= TargetWidth && SourceImage.Height > TargetHeight)//宽度比目的图片宽度小,长度比目的图片长度大
                {
                    IntHeight = TargetHeight;
                    IntWidth = (IntHeight * SourceImage.Width) / SourceImage.Height;
                }
                else if (SourceImage.Width <= TargetWidth && SourceImage.Height <= TargetHeight) //长宽比目的图片长宽都小
                {
                    IntHeight = SourceImage.Width;
                    IntWidth = SourceImage.Height;
                }
                else//长宽比目的图片的长宽都大
                {
                    IntWidth = TargetWidth;
                    IntHeight = (IntWidth * SourceImage.Height) / SourceImage.Width;
                    if (IntHeight > TargetHeight)//重新计算
                    {
                        IntHeight = TargetHeight;
                        IntWidth = (IntHeight * SourceImage.Width) / SourceImage.Height;
                    }
                }

                var x = (TargetWidth - IntWidth) / 2;
                var y = (TargetHeight - IntHeight) / 2;

                using (var newImage = new Bitmap(TargetWidth, TargetHeight))
                {
                    using (var graphic = Graphics.FromImage(newImage))
                    {              // 核心参数啊,感觉相当于PS保存时间的质量设置参数
                        Int64 qualityLevel = 80L;

                        // 高质量
                        graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                        graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                        qualityLevel = 100L;

                        // 低质量
                        //graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
                        //graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
                        //qualityLevel = 60L;

                        System.Drawing.Imaging.ImageCodecInfo codec = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()[1];
                        System.Drawing.Imaging.EncoderParameters eParams = new System.Drawing.Imaging.EncoderParameters(1);
                        eParams.Param[0]=new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityLevel);

                        graphic.DrawImage(SourceImage, 0, 0, TargetWidth, TargetHeight);
                        SourceImage.Dispose();

                        // 使用控制图片质量的保存方式
                        //newImage.Save(savePath);
                        newImage.Save(savePath, codec, eParams);
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }

原文地址:https://www.cnblogs.com/challengesoflife/p/12059567.html

时间: 2024-11-10 11:38:36

C# System.Drawing.Graphics 画图后,如何保存一个低质量的图片,一个占用空间较小的图片的相关文章

python 画图后柱状图保存到本地方法 plt.savefig(&quot;filename.png&quot;) python 使用 plt 画图后保存到本地 python保存柱状图/散点图/折线图/直方图到本地的方法

import matplotlib.pyplot as plt     """ 一些画图代码 """     plt.savefig("filename.png")   # 保存图片 注意 在show()之前  不然show会重新创建新的 图片   plt.show() import matplotlib.pyplot as plt """ 一些画图代码 """ pl

System.Drawing.Graphics中比较重要的几个方法

方法 常见参数 绘制的图形 DrawLine 钢笔.起点和终点 一段直线 DrawRectangle 钢笔.位置和大小 空心矩形 DrawEllipse 钢笔.位置和大小 空心椭圆 FillRectangle 画笔,位置和大小 实心矩形 FillEllipse 画笔,位置和大小 实心椭圆 DrawLines 画笔,点数组 一组线,把数组中的每个点按照顺序连接起来 DrawBezier 钢笔,四个点 通过两个端点的一条光滑曲线,剩余的两个点用于控制曲线的形状 DrawCurve 钢笔,点数组 通过

使用System.Drawing.Imaging.dll进行图片的合并

在最近开发项目的时候有时候需要进行图片的合并,即将两张图片合并成功一张图片 合并图片的代码: 1 #region 两张图片的合并 2 3 /// <summary > 4 /// 将Image对象转化成二进制流 5 /// </summary > 6 /// <param name="image" > </param > 7 /// <returns > </returns > 8 public byte[] Im

利用System.Drawing.Image类进行图片相关操作

C#中对图片的操作主要是通过System.Drawing.Image等类进行. 一.将图片转换为字节流 /// <summary> /// 图片处理帮助类 /// </summary> public static class PicProcessHelper { /// <summary> /// 将图片转换为指定的字节流 /// </summary> /// <param name="filePath">图片路径</p

.net学习笔记----利用System.Drawing.Image类进行图片相关操作

C#中对图片的操作主要是通过System.Drawing.Image等类进行. 一.将图片转换为字节流 /// <summary> /// 图片处理帮助类 /// </summary> public static class PicProcessHelper { /// <summary> /// 将图片转换为指定的字节流 /// </summary> /// <param name="filePath">图片路径</p

将System.Drawing.Bitmap转换为Direct2D.D2DBitmap

最近在尝试Direct2D编程,挺好玩的. 但是有时候还是会用到GDI+来生成图片,但D2D绘图需要用到自己的D2DBitmap类. 因此需要转换,查阅了下网上的资料,写了这么一个方法: 1 using System; 2 using System.Windows.Forms; 3 using System.Linq; 4 using System.Text; 5 using System.Diagnostics; 6 using DX = SharpDX; 7 using D2D = Shar

Asp.Net Core使用System.Drawing.Common部署到docker报错问题

原文:Asp.Net Core使用System.Drawing.Common部署到docker报错问题 Asp.Net Core 2.1发布后,正式支持System.Drawing.Common绘图了,可以用来做一些图片验证码之类的功能.但是把网站部署到docker容器里运行会遇到很多问题,也是非常闹心的,本文记录这些问题,希望帮到有需要的人. 创建网站 前提条件:安装最新版VS2017和Net Core SDK 2.1. 首先新建网站,选择Asp.Net Core 2.1 Web应用程序(模型

类库探源——System.Drawing.Bitmap

一.System.Drawing.Bitmap Bitmap 类: 封装GDI+ 位图,此位图由图形图像及其属性的像素数据组成.Bitmap 是用于处理由像素定义的图像的对象 命名空间: System.Drawing 程序集:   System.Drawing.dll 继承关系: 原型定义: [SerializableAttribute] [ComVisibleAttribute(true)] public sealed class Bitmap : Image 备注:GDI+ 支持下列文件格式

AutoCAD.Net/C#.Net QQ群:193522571 System.Drawing.Color和AutoDesk.AutoCAD.Colors.Color互转

假如各自实例化后的Color分别为: SysColor和CadColor 那么 SysColor转AutoDesk.AutoCAD.Colors.Color为:Autodesk.AutoCAD.Colors.Color.FromColor(SysColor) CadColor转 System.Drawing.Color为:CadColor.ColorValue