using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; namespace Core.StlMes.Client.LgResMgt.Mcms { /// /// 图片处理类 /// 1、生成缩略图片或按照比例改变图片的大小和画质 /// 2、将生成的缩略图放到指定的目录下 /// public class ImageZip { public Image ResourceImage, ReducedImage; private int ImageWidth; private int ImageHeight; public string ErrMessage; /// /// 类的构造函数 /// /// 图片文件的全路径名称 public ImageZip() { //ResourceImage = Image.FromFile(ImageFileName); ErrMessage = ""; } /// /// 类的构造函数 /// /// 图片文件的全路径名称 public ImageZip(string ImageFileName) { ResourceImage = Image.FromFile(ImageFileName); ErrMessage = ""; } public bool ThumbnailCallback() { return false; } /// /// 生成缩略图,返回缩略图的Image对象 /// /// 缩略图的宽度 /// 缩略图的高度 /// 缩略图的Image对象 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; } } /// /// 生成缩略图,将缩略图文件保存到指定的路径 /// /// 缩略图的宽度 /// 缩略图的高度 /// 缩略图保存的全文件名,(带路径),参数格式:D:\Images\filename.jpg /// 成功返回true,否则返回false 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; } } /// /// 生成缩略图,返回缩略图的Image对象 /// /// 缩略图的宽度百分比 如:需要百分之80,就填0.8 /// 缩略图的Image对象 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; } } /// /// 生成缩略图,返回缩略图的Image对象 /// /// 缩略图的宽度百分比 如:需要百分之80,就填0.8 /// 缩略图保存的全文件名,(带路径),参数格式:D:\Images\filename.jpg /// 成功返回true,否则返回false 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; } } /// /// 图像保存转化为数组 /// /// 传入图像文件名称 /// 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]; } } /// /// 获取图片文件的编码与解码 /// /// /// 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; } /// /// 二进制转换成图片 /// /// 二进制数组 /// 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; } } } }