


由于net core 中默认没有System.Drawing,可以通过nuget下载一个来代替System.Drawing.Common
c#图片压缩资源下载:http://www.tnblog.net/resource/aojiancc2/82A637FE71844F139F6DDB7BBA1B466B
直接压缩图片
- /// <summary>
- /// 图片压缩
- /// </summary>
- /// <param name="sFile">原图片位置</param>
- /// <param name="dFile">压缩后图片位置</param>
- /// <param name="dHeight">图片压缩后的高度</param>
- /// <param name="dWidth">图片压缩后的宽度</param>
- /// <param name="flag">图片压缩比0-100,数值越小压缩比越高,失真越多</param>
- /// <returns></returns>
- public static bool GetPicThumbnailTest(string sFile, string dFile, int dHeight, int dWidth, int flag)
- {
- System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
- //如果为参数为0就保持原图片的高宽嘛(不然想保持原图外面还要去读取一次)
- if (dHeight == 0)
- {
- dHeight = iSource.Height;
- }
- if (dWidth == 0)
- {
- dWidth = iSource.Width;
- }
-
-
- ImageFormat tFormat = iSource.RawFormat;
- int sW = 0, sH = 0;
-
- //按比例缩放
- Size tem_size = new Size(iSource.Width, iSource.Height);
-
- if (tem_size.Width > dHeight || tem_size.Width > dWidth)
- {
- if ((tem_size.Width * dHeight) > (tem_size.Width * dWidth))
- {
- sW = dWidth;
- sH = (dWidth * tem_size.Height) / tem_size.Width;
- }
- else
- {
- sH = dHeight;
- sW = (tem_size.Width * dHeight) / tem_size.Height;
- }
- }
- else
- {
- sW = tem_size.Width;
- sH = tem_size.Height;
- }
-
- Bitmap ob = new Bitmap(dWidth, dHeight);
- Graphics g = Graphics.FromImage(ob);
-
- g.Clear(Color.WhiteSmoke);
- g.CompositingQuality = CompositingQuality.HighQuality;
- g.SmoothingMode = SmoothingMode.HighQuality;
- g.InterpolationMode = InterpolationMode.HighQualityBicubic;
-
- g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
-
- g.Dispose();
- //以下代码为保存图片时,设置压缩质量
- EncoderParameters ep = new EncoderParameters();
- long[] qy = new long[1];
- qy[0] = flag;//设置压缩的比例1-100
- EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
- ep.Param[0] = eParam;
- try
- {
- ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
- ImageCodecInfo jpegICIinfo = null;
- for (int x = 0; x < arrayICI.Length; x++)
- {
- if (arrayICI[x].FormatDescription.Equals("JPEG"))
- {
- jpegICIinfo = arrayICI[x];
- break;
- }
- }
- if (jpegICIinfo != null)
- {
- ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径
- }
- else
- {
- ob.Save(dFile, tFormat);
- }
- return true;
- }
- catch
- {
- return false;
- }
- finally
- {
- iSource.Dispose();
- ob.Dispose();
- }
- }
通过文件流压缩图片
有些时候我们不想先把图片保存后,然后在去读取压缩,我们想通过文件流就直接对图片进行压缩了,比如我们要把图片上传到七牛云
先把流进行压缩在上传到七牛云就比较科学了
1:首先我们需要通过图片上传的流来获取图片
- foreach (IFormFile file in files)//获取多个文件列表集合
- {
- if (file.Length > 0)
- {
- //获取图片上传的流
- Stream stream = file.OpenReadStream();
- //直接从流里边变成图片
- System.Drawing.Image iSource = System.Drawing.Image.FromStream(stream);
- }
- }
2:通过图片压缩算法把图片进行压缩
这里有一个参数是输入流,后面还有一个是压缩后的输出流
- public static bool GetPicThumbnail(Stream stream,int dHeight, int dWidth, int flag,Stream outstream)
- {
- //可以直接从流里边得到图片,这样就可以不先存储一份了
- System.Drawing.Image iSource = System.Drawing.Image.FromStream(stream);
-
- //如果为参数为0就保持原图片
- if (dHeight == 0)
- {
- dHeight = iSource.Height;
- }
- if (dWidth == 0)
- {
- dWidth = iSource.Width;
- }
-
-
- ImageFormat tFormat = iSource.RawFormat;
- int sW = 0, sH = 0;
-
- //按比例缩放
- Size tem_size = new Size(iSource.Width, iSource.Height);
-
- if (tem_size.Width > dHeight || tem_size.Width > dWidth)
- {
- if ((tem_size.Width * dHeight) > (tem_size.Width * dWidth))
- {
- sW = dWidth;
- sH = (dWidth * tem_size.Height) / tem_size.Width;
- }
- else
- {
- sH = dHeight;
- sW = (tem_size.Width * dHeight) / tem_size.Height;
- }
- }
- else
- {
- sW = tem_size.Width;
- sH = tem_size.Height;
- }
-
- Bitmap ob = new Bitmap(dWidth, dHeight);
- Graphics g = Graphics.FromImage(ob);
-
- g.Clear(Color.WhiteSmoke);
- g.CompositingQuality = CompositingQuality.HighQuality;
- g.SmoothingMode = SmoothingMode.HighQuality;
- g.InterpolationMode = InterpolationMode.HighQualityBicubic;
-
- g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
-
- g.Dispose();
- //以下代码为保存图片时,设置压缩质量
- EncoderParameters ep = new EncoderParameters();
- long[] qy = new long[1];
- qy[0] = flag;//设置压缩的比例1-100
- EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
- ep.Param[0] = eParam;
- try
- {
- ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
- ImageCodecInfo jpegICIinfo = null;
- for (int x = 0; x < arrayICI.Length; x++)
- {
- if (arrayICI[x].FormatDescription.Equals("JPEG"))
- {
- jpegICIinfo = arrayICI[x];
- break;
- }
- }
- if (jpegICIinfo != null)
- {
- //可以存储在流里边;
- ob.Save(outstream, jpegICIinfo, ep);
-
- }
- else
- {
- ob.Save(outstream, tFormat);
- }
- return true;
- }
- catch
- {
- return false;
- }
- finally
- {
- iSource.Dispose();
- ob.Dispose();
- }
- }
3:把压缩后的图片转化成流,很简单用一个内存流来中转一下就好了
- MemoryStream memoryStream = new MemoryStream();
- ob.Save(memoryStream, jpegICIinfo, ep);//这里的ob就是压缩后的Bitmap对象
为了验证一下转化是否正确,我们可以把流在转化成图片然后在图片进行存储
- System.Drawing.Image imgSource = System.Drawing.Image.FromStream(memoryStream);
- imgSource.Save("url");
如果能够成功压缩并成功保存就说明这些步骤都成功了!
这里说一下图片传输的思路:
图片文件这种本身是无法进行传输的,就像跨语言的对象也是无法进行传输。但是我们可以事先约定一种标准,
让双方都可以认识都可以解析的一种标准,比如base64,比如对象的json序列化,比如光纤信号的光波表示,其实原理都是一样。
上传到七牛云前压缩图片
通过上面的方法可以得到一个输出流,我们可以通过它进行图片的保存,但是如果直接把这个输出流传递到七牛云的方法中去,图片是不能被上传成功的,存储大小会是0kb,说明我们这个流七牛云的接口识别不到,也就是约定的内容不一样,我们要改造成七牛云能够被识别的状态
换一个方法尝试,直接用流不行,就从流里边读出来字节数组试试
- //实例化一个内存流,存放压缩后的图片
- MemoryStream ysstream = new MemoryStream();
- bool issuc = ImageTool.GetPicThumbnail(stream, 300, 300, 80, ysstream);
-
- if (issuc)
- {
- //通过流上传图片到七牛云
- //HttpResult result = um.UploadStream(stream, saveKey, uploadToken);
- //从内存流里边读出来字节数组上传到七牛云
- HttpResult result = um.UploadData(ysstream.ToArray(), saveKey, uploadToken);
- if (result.Code == 200)
- {
- return Json(result.Text);
- }
- else
- {
- throw new Exception(result.RefText);//上传失败错误信息
- }
- }
- else
- {
- throw new Exception("图片压缩失败");//上传失败错误信息
- }
成功了!
换回流试试呢,不应该啊。传递流进去他里边也应该是读取的直接哇,本质上都一样哇
还是不行,看来得看一下他这个源码了,看一下他拿到这个流过后是怎么去用的,就能针对性解决问题了
题外话:解决的能力有时候比掌握知识的多少更重要哇,但是通常情况下是掌握的知识越多解决问题的能力就越强
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)