zoukankan      html  css  js  c++  java
  • C#放缩、截取、合并图片并生成高质量新图的类

    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();
            }
    }
    }
  • 相关阅读:
    SpringBoot学习
    Matlab立体标定mat转换成Opencv的CvMat
    由lib引发的血案(opencv找不函数问题)
    C# 使用Epplus导出Excel [4]:合并指定行
    C# 使用Epplus导出Excel [3]:合并列连续相同数据
    C# 使用Epplus导出Excel [2]:导出动态列数据
    C# 使用Epplus导出Excel [1]:导出固定列数据
    C# Excel常用控件总结
    C# IsNullOrEmpty与IsNullOrWhiteSpace
    C# 读App.config配置文件[2]: .Net Core框架
  • 原文地址:https://www.cnblogs.com/diulela/p/2854100.html
Copyright © 2011-2022 走看看