欢迎访问个人博客站点: 配置啦

分享一个项目中在用的图片处理工具类(图片缩放,旋转,画布格式,字节,image,bitmap转换等)

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Threading;

namespace ConfigLab.Comp.Img.ImgUtils
{
    /// <summary>
    /// 功能简介:图片转换类
    /// 创建时间:2016-9-10
    /// 创建人:pcw
    /// 博客:http://www.cnblogs.com/taohuadaozhu
    /// </summary>
    public class ImgConvert
    {
        /// <summary>
        /// 字节数组转换为bitmap
        /// </summary>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public static Bitmap BytesToBitmap(byte[] buffer)
        {
            Bitmap bitmapResult = null;
            if (buffer != null && buffer.Length > 0)
            {
                using (MemoryStream ms = new MemoryStream(buffer))
                {
                    try
                    {
                        bitmapResult = new Bitmap(ms);
                        return bitmapResult;
                    }
                    catch (Exception error)
                    {
                        return bitmapResult;
                    }
                    finally
                    {
                        ms.Close();
                        ms.Dispose();
                    }
                }
            }
            return null;
        }
        /// <summary>
        /// 字节数组转换为Image对象
        /// </summary>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public static Image BytesToImage(byte[] buffer)
        {
            if (buffer != null && buffer.Length > 0)
            {
                using (MemoryStream ms = new MemoryStream(buffer))
                {
                    Image image = null;
                    try
                    {
                        image = Image.FromStream(ms);
                        return image;
                    }
                    catch (Exception error)
                    {
                        return image;
                    }
                    finally
                    {
                        ms.Close();
                        ms.Dispose();
                    }
                }
            }
            return null;

        }

        /// <summary>
        /// 按照一定的比率进行放大或缩小
        /// </summary>
        /// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param> 
        /// <param name="rotateFlipType">
        ///顺时针旋转90度     RotateFlipType.Rotate90FlipNone
        ///逆时针旋转90度     RotateFlipType.Rotate270FlipNone
        ///水平翻转           RotateFlipType.Rotate180FlipY
        ///垂直翻转          RotateFlipType.Rotate180FlipX
        ///保持原样           RotateFlipType.RotateNoneFlipNone
        /// </param>
        /// <param name="IsTransparent">背景是否透明</param>
        /// <returns>Bitmap对象</returns>
        public static Bitmap GetImage_Graphics(Image ResourceImage, double Percent, RotateFlipType rotateFlipType, bool IsTransparent)
        {
            Bitmap ResultBmp = null;
            try
            {
                if (ResourceImage != null)
                {
                    ResourceImage.RotateFlip(rotateFlipType);
                    int _newWidth = (int)Math.Round(ResourceImage.Width * Percent);
                    int _newHeight = (int)Math.Round(ResourceImage.Height * Percent);
                    ResultBmp = new System.Drawing.Bitmap(_newWidth, _newHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);//创建图片对象
                    Graphics g = null;
                    try
                    {
                        g = Graphics.FromImage(ResultBmp);//创建画板并加载空白图像
                        if (g != null)
                        {
                            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; //System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;//设置保真模式为高度保真
                            g.DrawImage(ResourceImage, new Rectangle(0, 0, _newWidth, _newHeight), 0, 0, ResourceImage.Width, ResourceImage.Height, GraphicsUnit.Pixel);//开始画图
                            if (IsTransparent)
                            {
                                ResultBmp.MakeTransparent(System.Drawing.Color.Transparent);
                            }
                        }
                    }
                    catch (Exception errr)
                    {
                        ConfigLab.Utils.SaveErrorLog(string.Format("GetImage_Graphics(1),异常={0}", errr.Message));
                        Thread.Sleep(100);
                    }
                    finally
                    {
                        if (g != null)
                        {
                            g.Dispose();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ConfigLab.Utils.SaveErrorLog(string.Format("GetImage_Graphics(2),异常={0}", ex.Message));
                Thread.Sleep(100);
                return null;
            }
            finally
            {
                if (ResourceImage != null)
                {
                    ResourceImage.Dispose();
                }
            }
            return ResultBmp;
        }
        /// <summary>
        /// 图片等比缩放
        /// </summary>
        /// <param name="sImgFilePath"></param>
        /// <param name="Percent"></param>
        /// <returns></returns>
        public static bool ChangeImgSize(string sImgFilePath, double Percent,string sNewImgFilePath)
        {
            Image img = null;
            Bitmap bp = null;
            bool bSuccess = false;
            try
            {
                if (File.Exists(sImgFilePath) == false)
                {
                    Utils.SaveErrorLog(string.Format("找不到待压缩的原文件{0}", sImgFilePath));
                    return false;
                }
                img = Image.FromFile(sImgFilePath);
                if (img != null)
                {
                    bp = GetImage_Graphics(img, Percent, RotateFlipType.RotateNoneFlipNone, true);
                    if (bp != null)
                    {
                        string sDirectory = FilePathUtils.getDirectory(sNewImgFilePath);
                        if (sDirectory.EndsWith("\\") == false)
                        {
                            sDirectory = string.Format("{0}\\", sDirectory);
                        }
                        bp.Save(sNewImgFilePath);
                        bSuccess=true;
                    }
                }
            }
            catch(Exception ex)
            {
                Utils.SaveErrorLog(string.Format("ChangeImgSize处理{0}的图片且保存到{1}的任务执行失败",sImgFilePath,sNewImgFilePath), ex);
            }
            finally
            {
                if (img != null)
                {
                    img.Dispose();
                }
                if (bp != null)
                {
                    bp.Dispose();
                }
            }
            return bSuccess;
        }
        /// <summary>
        /// Resize图片
        /// </summary>
        /// <param name="bmp">原始Bitmap</param>
        /// <param name="newW">新的宽度</param>
        /// <param name="newH">新的高度</param>
        /// <returns>处理以后的Bitmap</returns>
        public static Bitmap ResizeBmp(Bitmap bmp, int newW, int newH)
        {
            try
            {
                Bitmap b = new Bitmap(newW, newH);
                Graphics g = Graphics.FromImage(b);
                g.SmoothingMode = SmoothingMode.HighSpeed;
                g.CompositingQuality = CompositingQuality.HighSpeed;
                g.InterpolationMode = InterpolationMode.Low;
                g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
                g.Dispose();

                return b;
            }
            catch
            {
                return null;
            }
        }

        /// 将图片Image转换成Byte[]
        /// </summary>
        /// <param name="Image">image对象</param>
        /// <param name="imageFormat">后缀名</param>
        /// <returns></returns>
        public static byte[] ImageToBytes(Image Image, System.Drawing.Imaging.ImageFormat imageFormat)
        {
            if (Image == null) { return null; }
            byte[] data = null;
            using (MemoryStream ms = new MemoryStream())
            {
                using (Bitmap Bitmap = new Bitmap(Image))
                {
                    Bitmap.Save(ms, imageFormat);
                    ms.Position = 0;
                    data = new byte[ms.Length];
                    ms.Read(data, 0, Convert.ToInt32(ms.Length));
                    ms.Flush();
                }
            }
            return data;
        }

        /// <summary>
        /// 通过FileStream 来打开文件,这样就可以实现不锁定Image文件,到时可以让多用户同时访问Image文件
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static Bitmap ReadImageFile(string path)
        {
            if (string.IsNullOrEmpty(path))
                return null;
            if (File.Exists(path) == false)
                return null;
            int filelength = 0;
            Bitmap bit = null;
            Byte[] image = null;
            try
            {
                using (FileStream fs = File.OpenRead(path))//OpenRead
                {
                    filelength = (int)fs.Length; //获得文件长度 
                    image = new Byte[filelength]; //建立一个字节数组 
                    fs.Read(image, 0, filelength); //按字节流读取 
                    System.Drawing.Image result = System.Drawing.Image.FromStream(fs);
                    bit = new Bitmap(result);
                    if (fs != null)
                    {
                        fs.Close();
                        fs.Dispose();
                    }
                }
            }
            catch (Exception err)
            {
                ConfigLab.Utils.SaveErrorLog(string.Format("读取图片【{0}】失败,调试信息={1}", path, err.Message + err.StackTrace));
            }
            finally
            {
                if (image != null)
                {
                    image = null;
                }
            }
            return bit;
        }
    }
}