using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System;
using System.Diagnostics;

namespace MeterPlugInLibrary
{
    /// <summary>  
    /// 图片处理类  
    /// 1、生成缩略图片或按照比例改变图片的大小和画质  
    /// 2、将生成的缩略图放到指定的目录下  
    /// </summary>  
    public class ImageZip
    {
        public Image ResourceImage, ReducedImage;
        private int ImageWidth;
        private int ImageHeight;
        public string ErrMessage;


        /// <summary>  
        /// 类的构造函数  
        /// </summary>  
        /// <param name="ImageFileName">图片文件的全路径名称</param>  
        public ImageZip()
        {
            //ResourceImage = Image.FromFile(ImageFileName);
            ErrMessage = "";
        }

        /// <summary>  
        /// 类的构造函数  
        /// </summary>  
        /// <param name="ImageFileName">图片文件的全路径名称</param>  
        public ImageZip(string ImageFileName)
        {
            ResourceImage = Image.FromFile(ImageFileName);
            ErrMessage = "";
        }

        public bool ThumbnailCallback()
        {
            return false;
        }

        /// <summary>  
        /// 生成缩略图，返回缩略图的Image对象  
        /// </summary>  
        /// <param name="Width">缩略图的宽度</param>  
        /// <param name="Height">缩略图的高度</param>  
        /// <returns>缩略图的Image对象</returns>  
        public Image GetReducedImage(int Width, int Height)
        {
            double LengthLong;          //存储（长和宽中）较短的长度  
            int widthOK, heightOK;      //存储实际要生成的图片的长宽  
            if (Width < Height)         //判断输入的长和宽那个较短  
            {
                LengthLong = Width;     //把较短的存储在 LengthLonh 用于计算  
            }
            else
            {
                LengthLong = Height;
            }
            try
            {
                //判断原图片 长和宽   
                //原图比较长的一个边要和缩略图的边相等  
                if (ResourceImage.Width > ResourceImage.Height)
                {
                    widthOK = (int)LengthLong;
                    heightOK = (int)(LengthLong / ResourceImage.Width * ResourceImage.Height);
                }
                else
                {
                    heightOK = (int)LengthLong;
                    widthOK = (int)LengthLong / ResourceImage.Height * ResourceImage.Width;

                }
                Image ReducedImage;
                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
                ReducedImage = ResourceImage.GetThumbnailImage(widthOK, heightOK, callb, IntPtr.Zero);
                return ReducedImage;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return null;
            }
        }

        /// <summary>  
        /// 生成缩略图，将缩略图文件保存到指定的路径
        /// </summary>  
        /// <param name="Width">缩略图的宽度</param>  
        /// <param name="Height">缩略图的高度</param>  
        /// <param name="targetFilePath">缩略图保存的全文件名，(带路径)，参数格式：D:\Images\filename.jpg</param>  
        /// <returns>成功返回true，否则返回false</returns>  
        public bool GetReducedImage(int Width, int Height, string targetFilePath)
        {
            double LengthLong;          //存储（长和宽中）较短的长度  
            int widthOK, heightOK;      //存储实际要生成的图片的长宽  
            if (Width < Height)         //判断输入的长和宽那个较短  
            {
                LengthLong = Width;     //把较短的存储在 LengthLonh 用于计算  
            }
            else
            {
                LengthLong = Height;
            }
            try
            {
                //判断原图片 长和宽   
                //原图比较长的一个边要和缩略图的边相等  
                if (ResourceImage.Width > ResourceImage.Height)
                {
                    widthOK = (int)LengthLong;
                    heightOK = (int)(LengthLong / ResourceImage.Width * ResourceImage.Height);
                }
                else
                {
                    heightOK = (int)LengthLong;
                    widthOK = (int)LengthLong / ResourceImage.Height * ResourceImage.Width;
                }
                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
                ReducedImage = ResourceImage.GetThumbnailImage(widthOK, heightOK, callb, IntPtr.Zero);
                ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg);

                ReducedImage.Dispose();

                return true;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message; //e.ToString();
                return false;
            }
        }

        /// <summary>  
        /// 生成缩略图，返回缩略图的Image对象  
        /// </summary>  
        /// <param name="Percent">缩略图的宽度百分比 如：需要百分之80，就填0.8</param>    
        /// <returns>缩略图的Image对象</returns>  
        public Image GetReducedImage(double Percent)
        {
            try
            {
                Image ReducedImage;
                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
                ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
                ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent);
                ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
                return ReducedImage;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return null;
            }
        }

        /// <summary>  
        /// 生成缩略图，返回缩略图的Image对象  
        /// </summary>  
        /// <param name="Percent">缩略图的宽度百分比 如：需要百分之80，就填0.8</param>    
        /// <param name="targetFilePath">缩略图保存的全文件名，(带路径)，参数格式：D:\Images\filename.jpg</param>  
        /// <returns>成功返回true,否则返回false</returns>  
        public bool GetReducedImage(double Percent, string targetFilePath)
        {
            try
            {
                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
                ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
                ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent);
                ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);
                ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg);
                //ReducedImage.Dispose();  
                return true;
            }
            catch (Exception e)
            {
                ErrMessage = e.Message;
                return false;
            }
        }


        /// <summary>
        /// 图像保存转化为数组
        /// </summary>
        /// <param name="strFileName">传入图像文件名称</param>
        /// <returns></returns>
        public static byte[] ZipImageByte(string strImagePath)
        {
            try
            {
                long Dest_Size = 55296;
                Bitmap img = null;
                if (System.IO.File.Exists(strImagePath))
                {
                    img = new Bitmap(strImagePath);
                }
                else
                {
                    return new byte[1];
                }

                MemoryStream bmpStream = new MemoryStream();
                img.Save(bmpStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                if (bmpStream.ToArray().Length < Dest_Size)
                {
                    img.Dispose();
                    return bmpStream.ToArray();
                }
                else
                {
                    ImageFormat __format;
                    System.Drawing.Imaging.Encoder __encoder;
                    EncoderParameter __encoderParameter;
                    EncoderParameters __encoderParameters;
                    ImageCodecInfo __imageCodecInfo;

                    __imageCodecInfo = DoGetEncoderInfo("image/jpeg");

                    __encoder = System.Drawing.Imaging.Encoder.Quality;
                    __encoderParameters = new EncoderParameters(1);

                    long dLevel = 40L;
                    long Len = Dest_Size;
                    /*
                    do
                    {
                        if (dLevel > 15)
                        {
                            dLevel -= 5;
                        }
                        else
                        {
                            dLevel -= 1;
                        }
                        __encoderParameter = new EncoderParameter(__encoder, dLevel); //图片质量 
                        __encoderParameters.Param[0] = __encoderParameter;

                        __format = ImageFormat.Jpeg;
                        bmpStream = new MemoryStream();
                        img.Save(bmpStream, __imageCodecInfo, __encoderParameters);
                        Len = bmpStream.ToArray().Length;
                        if (Len <= Dest_Size) break;
                    } while (dLevel > 0);
                    //*/

                    __encoderParameter = new EncoderParameter(__encoder, dLevel); //图片质量 
                    __encoderParameters.Param[0] = __encoderParameter;
                    bmpStream = new MemoryStream();
                    img.Save(bmpStream, __imageCodecInfo, __encoderParameters);
                    Len = bmpStream.ToArray().Length;

                    img.Dispose();
                    return bmpStream.ToArray();
                }
            }
            catch (Exception exp)
            {
                Debug.Print(exp.Message);
                return new byte[1];
            }
        }

        /// <summary>
        /// 获取图片文件的编码与解码
        /// </summary>
        /// <param name="MYmimeType"></param>
        /// <returns></returns>
        public static ImageCodecInfo DoGetEncoderInfo(string MYmimeType)
        {
            int i = 0;
            System.Drawing.Imaging.ImageCodecInfo[] encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
            for (i = 0; i < encoders.Length; i++)
            {
                if (encoders[i].MimeType == MYmimeType)
                {
                    return encoders[i];
                }
            }
            return null;
        }

        /// <summary>
        /// 二进制转换成图片
        /// </summary>
        /// <param name="Bytes">二进制数组</param>
        /// <returns></returns>
        public static Bitmap BytesToBitmap(byte[] Bytes)
        {

            if (Bytes.Length == 0 || Bytes.Length == 1)
            {
                return null;
            }
            try
            {
                MemoryStream ImageMem = new MemoryStream(Bytes, true);
                ImageMem.Write(Bytes, 0, Bytes.Length);
                Bitmap _Image = new Bitmap(ImageMem);
                return _Image;
            }
            catch (Exception ex)
            {
                Debug.Print(ex.Message);
                return null;
            }

        }
    }
}
