.NET使用EncoderParameter
压缩图片及使用BitmapScaling
缩放图片
/// <summary>
/// 图片流的压缩及缩放
/// </summary>
/// <param name="imageStream">输入流</param>
/// <param name="max_width">最大宽度</param>
/// <param name="isChange">是否切换至.jpg</param>
public static byte[] BitmapExecute(Stream imageStream, int max_width, out bool isChange)
{
using (Image img = Image.FromStream(imageStream))
{
ImageFormat rawFormat = img.RawFormat;
using (Bitmap bitmap = BitmapScaling(img, max_width))
{
return BitmapCompress(bitmap, rawFormat, out isChange);
}
}
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
/// <summary>
/// 图片缩放
/// </summary>
/// <param name="img">原始图片</param>
/// <param name="max_width">最大宽度</param>
private static Bitmap BitmapScaling(Image img, int max_width)
{
/*-- 输出图片的长和宽 --*/
int out_width, out_height;
if (img.Width > max_width)
{
out_width = max_width;
/*-- 高度等比缩放 --*/
out_height = img.Height * max_width / img.Width;
}
else
{
out_width = img.Width;
out_height = img.Height;
}
Bitmap ob = new Bitmap(out_width, out_height);
using (Graphics g = Graphics.FromImage(ob))
{
g.Clear(Color.WhiteSmoke);
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(img, new Rectangle(0, 0, out_width, out_height),
new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
}
return ob;
}
/// <summary>
/// 压缩等级(1-100)
/// </summary>
const long compress_level = 80;
/// <summary>
/// 图片压缩
/// </summary>
/// <param name="bitmap">原始图片</param>
/// <param name="_format">类型</param>
/// <param name="isChange">是否已切换.jpg</param>
private static byte[] BitmapCompress(Bitmap bitmap, ImageFormat _format, out bool isChange)
{
isChange = false;
//以下代码为保存图片时,设置压缩质量
EncoderParameters ep = null;
MemoryStream stream = null;
try
{
ep = new EncoderParameters();
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, new long[1] { compress_level });
ep.Param[0] = eParam;
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo encoder = encoders.Where(s => s.FormatDescription.Equals("JPEG")).FirstOrDefault();
stream = new MemoryStream();
if (encoder != null)
{
bitmap.Save(stream, encoder, ep);
isChange = true;
}
else
bitmap.Save(stream, _format);
return stream.GetBuffer();
}
finally
{
ep?.Dispose();
stream?.Dispose();
}
}