zoukankan      html  css  js  c++  java
  • .net图片压缩的几种方法

    方法一

    private void button3_Click(object sender, EventArgs e)
    {
    using (OpenFileDialog ofd = new OpenFileDialog())
    {
    ofd.Filter = "图片|*.jpg;*.png;*.gif;*.jpeg;*.bmp";
    if (ofd.ShowDialog() == DialogResult.OK)
    {
    using (FileStream file = new FileStream(ofd.FileName, FileMode.Open))
    {
    var img = CompressionImage(file, 50L);
    MessageBox.Show(CreateImageFromBytes(AppDomain.CurrentDomain.BaseDirectory + @"" + Guid.NewGuid().ToString(), img));
    }

    }
    }
    }

    /// <summary>
    /// Convert Byte[] to Image
    /// </summary>
    /// <param name="buffer"></param>
    /// <returns></returns>
    public static Image BytesToImage(byte[] buffer)
    {
    MemoryStream ms = new MemoryStream(buffer);
    Image image = System.Drawing.Image.FromStream(ms);
    return image;
    }

    /// <summary>
    /// Convert Byte[] to a picture and Store it in file
    /// </summary>
    /// <param name="fileName"></param>
    /// <param name="buffer"></param>
    /// <returns></returns>
    public static string CreateImageFromBytes(string fileName, byte[] buffer)
    {
    string file = fileName;
    Image image = BytesToImage(buffer);
    ImageFormat format = image.RawFormat;
    if (format.Equals(ImageFormat.Jpeg))
    {
    file += ".jpeg";
    }
    else if (format.Equals(ImageFormat.Png))
    {
    file += ".png";
    }
    else if (format.Equals(ImageFormat.Bmp))
    {
    file += ".bmp";
    }
    else if (format.Equals(ImageFormat.Gif))
    {
    file += ".gif";
    }
    else if (format.Equals(ImageFormat.Icon))
    {
    file += ".icon";
    }
    System.IO.FileInfo info = new System.IO.FileInfo(file);
    System.IO.Directory.CreateDirectory(info.Directory.FullName);
    File.WriteAllBytes(file, buffer);
    return file;
    }
    /// <summary>
    /// 壓縮圖片 /// </summary>
    /// <param name="fileStream">圖片流</param>
    /// <param name="quality">壓縮質量0-100之間 數值越大質量越高</param>
    /// <returns></returns>
    private byte[] CompressionImage(Stream fileStream, long quality)
    {
    using (System.Drawing.Image img = System.Drawing.Image.FromStream(fileStream))
    {
    using (Bitmap bitmap = new Bitmap(img))
    {
    ImageCodecInfo CodecInfo = GetEncoder(img.RawFormat);
    System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
    EncoderParameters myEncoderParameters = new EncoderParameters(1);
    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, quality);
    myEncoderParameters.Param[0] = myEncoderParameter;
    using (MemoryStream ms = new MemoryStream())
    {
    bitmap.Save(ms, CodecInfo, myEncoderParameters);
    myEncoderParameters.Dispose();
    myEncoderParameter.Dispose();
    return ms.ToArray();
    }
    }
    }
    }

    private static ImageCodecInfo GetEncoder(ImageFormat format)
    {
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
    foreach (ImageCodecInfo codec in codecs)
    {
    if (codec.FormatID == format.Guid)
    { return codec; }
    }
    return null;
    }

    方法二

    //string newImg = "images/MGoods/Detail_" + goods.ID + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ext;
    //Bitmap MyMap = new Bitmap(Server.MapPath(imgs.ImgUrl));
    //if (!imghelper.GetPicThumbnail(path.TrimEnd('/') + imgs.ImgUrl, path + newImg, MyMap.Size.Height, MyMap.Size.Width, 1))
    //{
    // return Content("上传图片失败");
    //}
    //try
    //{
    // if (!string.IsNullOrEmpty(imgs.ImgUrl))
    // {
    // string delFile = Server.MapPath("~") + imgs.ImgUrl;
    // System.IO.File.Delete(delFile);
    // }
    //}
    //catch (Exception)
    //{
    //}

    /// <summary>
    /// 无损压缩图片 这样压缩后背景白色变为灰色? 而且会截取一半主要是dHeight
    /// </summary>
    /// <param name="sFile">原图片</param>
    /// <param name="dFile">压缩后保存位置</param>
    /// <param name="dHeight">高度</param>
    /// <param name="dWidth">宽度</param>
    /// <param name="flag">压缩质量 1-100</param>
    /// <returns></returns>
    public static bool GetPicThumbnail(string sFile, string dFile, int dHeight, int dWidth, int flag)
    {
    System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
    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) //将**改成c#中的或者操作符号
    {
    if ((tem_size.Width * dHeight) > (tem_size.Height * 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();

    }
    }

  • 相关阅读:
    收藏篇基础命令
    itchat+图灵机器人实现python登录微信并自动回复
    四级物理实验
    天行数据网易云热评接口python脚本模板运行出错||socket.gaierror: [Errno 11001] getaddrinfo failed
    每日一道: 两数之和 简单
    每日一道:求和
    每日一道:四数之和
    每日一道:最接近的三数之和
    每日一道:盛最多水的容器
    MySQL中GRANT和IDENTIFIED同时使用时出现near 'IDENTIFIED BY...” at line 1错误
  • 原文地址:https://www.cnblogs.com/flms/p/12848951.html
Copyright © 2011-2022 走看看