.NET图片压缩和缩放
2017-12-05

0X2 摘要

.NET使用EncoderParameter压缩图片及使用BitmapScaling 缩放图片

0X2 使用

/// <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);
        }
    }
}

0X3 图片长宽等比缩放

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;
}

0X4 图片文件大小压缩

/// <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();
    }
}