using System; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; using System.IO; namespace Framework { public class ImageClass { public Image ResourceImage; public int Width=0; public int Height=0; private int ImageWidth; private int ImageHeight; private ImageFormat imgFormat; public string ErrMessage; public ImageClass(string ImageFileName) { ResourceImage = Image.FromFile(ImageFileName); Width = ResourceImage.Width; Height = ResourceImage.Height; imgFormat = ResourceImage.RawFormat; ErrMessage = ""; } public ImageClass(byte[] Img) { MemoryStream imgStream = new MemoryStream(Img); try { ResourceImage = System.Drawing.Image.FromStream(imgStream); Width = ResourceImage.Width; Height = ResourceImage.Height; imgFormat = ResourceImage.RawFormat; } catch (Exception ex) { ErrMessage = ex.ToString(); } } public bool ThumbnailCallback() { return false; } public Image GetReducedImage(int Width, int Height) { try { Image ReducedImage; Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero); return ReducedImage; } catch (Exception e) { ErrMessage = e.Message; return null; } } public bool GetReducedImage(int Width, int Height, string targetFilePath) { try { EncoderParameter p; EncoderParameters ps; ps = new EncoderParameters(1); p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L); ps.Param[0] = p; Image ReducedImage; Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero); Graphics g = System.Drawing.Graphics.FromImage(ReducedImage); // 设置画布的描绘质量 g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); g.DrawImage(ResourceImage, new Rectangle(0, 0, Width, Height), new Rectangle(0, 0, ResourceImage.Width, ResourceImage.Height), GraphicsUnit.Pixel); ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString()); if (imgCodecInfo == null) { ReducedImage.Save(targetFilePath, imgFormat); } else { ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps); } ReducedImage.Dispose(); g.Dispose(); return true; } catch (Exception e) { ErrMessage = e.Message; return false; } } 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.Height * Percent); ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero); return ReducedImage; } catch (Exception e) { ErrMessage = e.Message; return null; } } public bool GetReducedImage(double Percent, string targetFilePath) { try { EncoderParameter p; EncoderParameters ps; ps = new EncoderParameters(1); p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L); ps.Param[0] = p; Image ReducedImage; Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent); ImageHeight = Convert.ToInt32(ResourceImage.Height * Percent); ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero); Graphics g = System.Drawing.Graphics.FromImage(ReducedImage); // 设置画布的描绘质量 g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); g.DrawImage(ResourceImage, new Rectangle(0, 0, ImageWidth, ImageHeight), new Rectangle(0, 0, ResourceImage.Width, ResourceImage.Height), GraphicsUnit.Pixel); ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString()); if (imgCodecInfo == null) { ReducedImage.Save(targetFilePath, imgFormat); } else { ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps); } ReducedImage.Dispose(); g.Dispose(); return true; } catch (Exception e) { ErrMessage = e.Message; return false; } } public bool GetReducedImage(string targetFilePath) { try { ResourceImage.Save(targetFilePath, ImageHelper.GetFormat(targetFilePath)); return true; } catch (Exception e) { ErrMessage = e.Message; return false; } } public bool CaptureImg(string targetFilePath, int width, int height, int spaceX, int spaceY) { try { //载入底图 int x = 0; //截取X坐标 int y = 0; //截取Y坐标 //原图宽与生成图片宽 之差 //当小于0(即原图宽小于要生成的图)时,新图宽度为较小者 即原图宽度 X坐标则为0 //当大于0(即原图宽大于要生成的图)时,新图宽度为设置值 即width X坐标则为 sX与spaceX之间较小者 //Y方向同理 int sX = ResourceImage.Width - width; int sY = ResourceImage.Height - height; if (sX > 0) { x = sX > spaceX ? spaceX : sX; } else { width = ResourceImage.Width; } if (sY > 0) { y = sY > spaceY ? spaceY : sY; } else { height = ResourceImage.Height; } EncoderParameter p; EncoderParameters ps; ps = new EncoderParameters(1); p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L); ps.Param[0] = p; Bitmap ReducedImage = new Bitmap(width, height); Graphics g = System.Drawing.Graphics.FromImage(ReducedImage); // 设置画布的描绘质量 g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); g.DrawImage(ResourceImage, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel); ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString()); if (imgCodecInfo == null) { ReducedImage.Save(targetFilePath, imgFormat); } else { ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps); } //释放资源 //saveImage.Dispose(); ReducedImage.Dispose(); g.Dispose(); } catch (Exception ex) { ErrMessage = ex.Message; return false; } return true; } public bool MergerImg(string targetFilePath, int ImgWidth, int ImgHeight) { try { EncoderParameter p; EncoderParameters ps; ps = new EncoderParameters(1); p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L); ps.Param[0] = p; //创建要显示的图片对象,根据参数的个数设置宽度 Bitmap ReducedImage = new Bitmap(ImgWidth, ImgHeight); Graphics g = Graphics.FromImage(ReducedImage); // 设置画布的描绘质量 g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); int StartX = (ImgWidth - this.Width) / 2; int StartY = (ImgHeight - this.Height) / 2; g.DrawImage(ResourceImage, StartX, StartY, this.Width, this.Height); //保存图象 ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString()); if (imgCodecInfo == null) { ReducedImage.Save(targetFilePath, imgFormat); } else { ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps); } //释放资源 ReducedImage.Dispose(); g.Dispose(); } catch (Exception ex) { ErrMessage = ex.Message; return false; } return true; } public bool MergerImg(string targetFilePath, System.Drawing.Image image, int ImgWidth, int ImgHeight) { try { EncoderParameter p; EncoderParameters ps; ps = new EncoderParameters(1); p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L); ps.Param[0] = p; //创建要显示的图片对象,根据参数的个数设置宽度 Bitmap ReducedImage = new Bitmap(ImgWidth, ImgHeight); Graphics g = Graphics.FromImage(ReducedImage); // 设置画布的描绘质量 g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); int StartX = (ImgWidth - image.Width) / 2; int StartY = (ImgHeight - image.Height) / 2; g.DrawImage(image, StartX, StartY, image.Width, image.Height); //保存图象 ImageCodecInfo imgCodecInfo = GetCodecInfo(imgFormat.ToString()); if (imgCodecInfo == null) { ReducedImage.Save(targetFilePath, imgFormat); } else { ReducedImage.Save(targetFilePath, GetCodecInfo(targetFilePath), ps); } //释放资源 ReducedImage.Dispose(); g.Dispose(); } catch (Exception ex) { ErrMessage = ex.Message; return false; } return true; } //返回图片解码器信息用于jpg图片 private ImageCodecInfo GetCodecInfo(string str) { string ext = str.Substring(str.LastIndexOf(".") + 1); string mimeType = ""; switch (ext.ToLower()) { case "jpe": case "jpg": case "jpeg": mimeType = "image/jpeg"; break; case "bmp": mimeType = "image/bmp"; break; case "png": mimeType = "image/png"; break; case "tif": case "tiff": mimeType = "image/tiff"; break; default: mimeType = "image/jpeg"; break; } ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders(); foreach (ImageCodecInfo ici in CodecInfo) { if (ici.MimeType == mimeType) return ici; } return null; } public void Dispose() { ResourceImage.Dispose(); } } }