• C# :实现水印与图片合成,并利用Graphics 压缩图像质量 , (委托实现listBox的动态添加提示)


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    using System.IO;
    using System.Drawing.Text;
    using System.Drawing.Drawing2D;
    using System.Drawing.Imaging;
    using System.Threading;
    namespace FontDemo
    {
        public partial class MarkImage : Form
        {
             int i = 0;
            public MarkImage()
            {
                InitializeComponent();
            }
    
            private void MarkImage_Load(object sender, EventArgs e)
            {
    
            }
    
            /// <summary>
            /// 保存图片 " 图片水印 " 
            /// </summary>
            /// <param name="InUploadImagePath">原服务器图片路径</param>
            ///<param name="inLogoImagePath">生成的带图片水印的图片路径</param>
            ///<param name="InSavePath">水印图片路径</param>
            ///<param name="strType">原图片文件类型</param>
            public void MarkToImage(string InUploadImagePath, string inLogoImagePath, string InSavePath, string strType)
            {
                //FileStream fs = new FileStream(System.Windows.Forms.Application.StartupPath + @"\Img\" + InUploadImagePath, FileMode.Open, FileAccess.ReadWrite);
                //System.Drawing.Image img = System.Drawing.Image.FromStream(fs, false, false);
                //Bitmap bmp = new Bitmap(img);
                //img.Dispose();
                //fs.Close();
    
                //System.Drawing.Image Image = bmp;
                //System.Drawing.Image newimage = System.Drawing.Image.FromFile(System.Windows.Forms.Application.StartupPath + @"\" + inLogoImagePath);
                //Graphics g = Graphics.FromImage(Image);
                //g.DrawImage(newimage, new Rectangle(Image.Width - newimage.Width, Image.Height - newimage.Height, newimage.Width, newimage.Height), 0, 0, newimage.Width, newimage.Height, GraphicsUnit.Pixel);
    
                //System.Drawing.Image Image = System.Drawing.Image.FromFile(System.Windows.Forms.Application.StartupPath + @"\Img\" +InUploadImagePath);
                //System.Drawing.Image newimage = System.Drawing.Image.FromFile(System.Windows.Forms.Application.StartupPath + @"\" +inLogoImagePath);
                //Graphics g = Graphics.FromImage(Image);
                //g.DrawImage(newimage, new Rectangle(Image.Width - newimage.Width, Image.Height - newimage.Height, newimage.Width, newimage.Height), 0, 0, newimage.Width, newimage.Height, GraphicsUnit.Pixel);
                //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                //g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
    
                //Image.Save(System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + InSavePath);
                //string pith = "C:\\Documents and Settings\\Administrator\\桌面\\临时目录\\IMg-09-07-21\\FontDemo\\FontDemo\\bin\\Debug\\ImgBak\\" + InSavePath;
                //Image.Save(pith);
                //System.Windows.Forms.Application.StartupPath = "C:\\Documents and Settings\\Administrator\\桌面\\临时目录\\IMg-09-07-21\\FontDemo\\FontDemo\\bin\\Debug"
    
                Bitmap imgTemp = new Bitmap(System.Windows.Forms.Application.StartupPath + @"\Img\" + InUploadImagePath);//创建Image对象,大小为200 * 200
                Graphics gType = Graphics.FromImage(imgTemp);//在Image对象上创建Graphics对象g2
                GraphicsPath typePath = new GraphicsPath();
                Bitmap img = new Bitmap(System.Windows.Forms.Application.StartupPath + @"\" + inLogoImagePath);//创建Image对象,大小为200 * 200
    
                try
                {
                    //gType.DrawImage(img, 590, 1100, img.Width, img.Height);
                    gType.DrawImage(img, new Rectangle(imgTemp.Width - img.Width, imgTemp.Height - img.Height, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
    
                    string ps = System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + InUploadImagePath;
                    imgTemp.Save(ps, System.Drawing.Imaging.ImageFormat.Png);
    
                   
                   
                  
                }
                catch (Exception de)
                {
                    MessageBox.Show(de.Message);
                }
                finally
                {
                    //MyItem item1 = new MyItem();
                    //item1.id = i.ToString();
                    //item1.name = InUploadImagePath + " - 已生成..";
    
                    //i++;
    
                    //this.listBox1.Items.Add(item1);
                    //this.pictureBox1.Image = imgTemp;
    
                    typePath.Dispose();
                    imgTemp.Dispose();
                    img.Dispose();
                    //newimage.Dispose();
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                this.listBox1.Items.Clear();
    
                MethodInvoker mi = new MethodInvoker(Add);
                mi.BeginInvoke(null, null);   
    
                
                   
             }
    
            public  class MyItem : object
            {
                public  string name;
                public  string id;
                public override string ToString()
                {
                    // TODO:   添加 MyItem.ToString 实现
                    return name;
                }
            }
    
            public delegate void delegateMethod(string fileName, Bitmap imgTem);
    
            public void Add()
            {
                DelegateChangeButton bu = new DelegateChangeButton(ButtonEnable);
                this.BeginInvoke(bu, new object[] { false });
               
                string sd = AppDomain.CurrentDomain.BaseDirectory + "Img";
                string[] files = Directory.GetFiles(sd);
                foreach (string f in files)
                {
                    if (f.LastIndexOf("\\") != -1)
                    {
                        string strFile = f.Substring(f.LastIndexOf("\\") + 1);
                        string strType = strFile.Substring(strFile.Length - 3, 3);
                        if (strType.ToLower() == "bmp" || strType.ToLower() == "png" || strType.ToLower() == "jpg")
                        {              
                            Bitmap imgTemp = new Bitmap(System.Windows.Forms.Application.StartupPath + @"\Img\" + strFile);//创建Image对象,大小为200 * 200
                            Graphics gType = Graphics.FromImage(imgTemp);//在Image对象上创建Graphics对象g2
                            GraphicsPath typePath = new GraphicsPath();
                            Bitmap img = new Bitmap(System.Windows.Forms.Application.StartupPath + @"\" + "ddK.png");//创建Image对象,大小为200 * 200
    
                            if (imgTemp.Width >= 400 && imgTemp.Height >= 150)
                            {
    
                                try
                                {
                                    ////EncoderParameter p;
                                    ////EncoderParameters ps;
                                    ////ps = new EncoderParameters(1);
                                    ////p = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.CompressionLZW);
                                    ////ps.Param[0] = p;
                                    
                                    ////gType.DrawImage(img, new Rectangle(imgTemp.Width - img.Width, imgTemp.Height - img.Height, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
                                    ////gType.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                                    ////gType.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                                    ////gType.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
    
                                    ////string pngB = System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + strFile;
                                    ////imgTemp.Save(pngB, GetCodecInfo("image/bmp"), ps);
    
                                    //EncoderParameter p;
                                    //EncoderParameters ps;
                                    //ps = new EncoderParameters(1);
                           
                                    ////p = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionRle);
                                    //long sdd = (long)EncoderValue.CompressionRle;
                                    //p = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.TransformRotate270);
                                    //ps.Param[0] = p;
    
                                    gType.DrawImage(img, new Rectangle(imgTemp.Width - img.Width, imgTemp.Height - img.Height, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
                                    //gType.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                                    //gType.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                                    //gType.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
    
                                    string pngB = System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + strFile;
                                    //imgTemp.Save(pngB, GetCodecInfo("image/jpeg"), ps);
    
    
                                    //imgTemp.Save(pngB, System.Drawing.Imaging.ImageFormat.Png);
                                    EncoderParameters encoderParams = new EncoderParameters();
                                    long[] quality = new long[1];
                                    quality[0] = 92; //压缩比例,决定图片大小的重要因素。
                                    EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
                                    encoderParams.Param[0] = encoderParam;
                                   
                                    imgTemp.Save(System.Windows.Forms.Application.StartupPath + @"\ImgBak\" + strFile, GetCodecInfo("image/jpeg"), encoderParams);
    
                                    if (listBox1.InvokeRequired)
                                    {
                                        delegateMethod m = new delegateMethod(Referesh);
                                        this.BeginInvoke(m, new object[] { strFile, imgTemp });
                                    }
                                    else
                                    {
                                        Referesh(strFile, imgTemp);
                                    }
                                    Thread.Sleep(100);
    
                                    //EncoderParameters encoderParams = new EncoderParameters();
                                    //long[] quality = new long[1];
                                    //quality[0] = 90;
                                    //EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
                                    //encoderParams.Param[0] = encoderParam;
                                    //Bitmap imgLast = new Bitmap(pngB);//创建Image对象
                                    //imgLast.Save(System.Windows.Forms.Application.StartupPath + @"\images\" + strFile, GetCodecInfo("image/jpeg"), encoderParams);
    
                                   // SmallPic(pngB, System.Windows.Forms.Application.StartupPath + @"\images\" + strFile, imgTemp.Width, imgTemp.Height);
                                }
                                catch (Exception de)
                                {
                                    MessageBox.Show(de.Message);
                                }
                                finally
                                {
    
                                    typePath.Dispose();
                                    //imgTemp.Dispose();
                                    //img.Dispose();
                                }
                            }
                        }
                    }
                }
    
                delegateMethodEND en = new delegateMethodEND(EndList);
                this.BeginInvoke(en);
    
                this.BeginInvoke(bu, new object[] { true });
    
            }
    
             /**//// <summary>
            /// 保存JPG时用
            /// </summary>
            /// <param name="mimeType"></param>
            /// <returns>得到指定mimeType的ImageCodecInfo</returns>
            private  ImageCodecInfo GetCodecInfo(string mimeType)
            {
                 ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
                foreach (ImageCodecInfo ici in CodecInfo)
                {
                    if (ici.MimeType == mimeType) return ici;
                 }
                return null;
             }
    
            public void ButtonEnable(bool flag)
            {
                this.button1.Enabled = flag;
            }
            public void Referesh(string fileName, Bitmap imgTem)
            {
                listBox1.Items.Add(DateTime.Now.ToShortTimeString() + @"分 - ImgBak\" + fileName + "  已生成");
                listBox1.SelectedIndex = listBox1.Items.Count - 1;
                this.pictureBox1.Image = imgTem;
    
                Application.DoEvents();
            }
    
            public void EndList()
            {
                listBox1.Items.Add(DateTime.Now.ToShortTimeString() + @"分  -网站所有水印图生成结束!");
                listBox1.SelectedIndex = listBox1.Items.Count - 1;     
               
            }
            public delegate void delegateMethodEND();
            public delegate void DelegateChangeButton(bool flag);
    
            //public delegate void DelegateChangeIMG(Bitmap imgTem); 
    
            public  bool SmallPic(string strOldPic, string strNewPic, int widthEx, int heightEx)
            {//提供原始图片,目标路径,以及想要生成的缩略图尺寸
                System.Drawing.Bitmap objPic, objNewPic;
                objPic = new System.Drawing.Bitmap(strOldPic);
                int width, height;
                width = objPic.Width;
                height = objPic.Height;
    
                if ((int)(height / heightEx) >= (int)(width / widthEx))
                {//高度压缩比例大于宽度
                    SmallPicW(strOldPic, strNewPic, heightEx, widthEx);
                    objPic.Dispose();
                    return true;
                }
                else
                {//高度压缩比例小于宽度
                    SmallPicH(strOldPic, strNewPic, widthEx, heightEx);
                    objPic.Dispose();
                    return true;
                }
            }
    
            ///下面这个函数处理高度压缩比例小于宽度的情况
            private  void SmallPicH(string strOldPic, string strNewPic, int intWidth, int descHeight)
            {
                System.Drawing.Bitmap objPic, smallObjPic, objNewPic;
                objPic = null;
                objNewPic = null;
                smallObjPic = null;
                try
                {
                    objPic = new System.Drawing.Bitmap(strOldPic);
    
                    //将原始图片放入到内存里 
                    int intHeight = (intWidth * objPic.Height) / objPic.Width;
                    smallObjPic = new System.Drawing.Bitmap(objPic, intWidth, intHeight);
                    objNewPic = new System.Drawing.Bitmap(intWidth, descHeight, PixelFormat.Format64bppPArgb);
                    //在内存里生成一张跟缩略图尺寸一样的空图片。
                    objNewPic.SetResolution(objPic.HorizontalResolution, objPic.VerticalResolution);
                    Graphics grPhoto = Graphics.FromImage(objNewPic);
                    if (objPic.Width < intWidth)
                    {
                        grPhoto.FillRectangle(System.Drawing.Brushes.White, 0, 0, intWidth, descHeight);
                        grPhoto.DrawImage(smallObjPic, new Rectangle((intWidth - objPic.Width) / 2,
                        (descHeight - objPic.Height) / 2, objPic.Width, objPic.Height));
                    }
                    else
                    {
                        grPhoto.FillRectangle(System.Drawing.Brushes.White, 0, 0, intWidth, descHeight);
                        grPhoto.DrawImage(smallObjPic, new Rectangle(0, (descHeight - intHeight) / 2, intWidth, intHeight)
                        , 0, 0, intWidth, intHeight, System.Drawing.GraphicsUnit.Pixel);
                    }
    
    
                    #region  保存图片
                    EncoderParameters encoderParams = new EncoderParameters();
                    long[] quality = new long[1];
                    quality[0] = 90;
                    EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
                    encoderParams.Param[0] = encoderParam;
                    //获得包含对应的图片编解码程序 
                    ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo jpegICI = null;
                    for (int x = 0; x < arrayICI.Length; x++)
                    {
                        if (arrayICI[x].FormatDescription.Equals("JPEG"))
                        {
                            jpegICI = arrayICI[x];//
                            break;
                        }
                    }
                    if (jpegICI != null)
                    {
                        objNewPic.Save(strNewPic, jpegICI, encoderParams);
                    }
                    else
                    {
                        objNewPic.Save(strNewPic, System.Drawing.Imaging.ImageFormat.Jpeg);
                    }
                    objPic.Dispose();
                    objPic = null;
                    objNewPic.Dispose();
                    objNewPic = null;
                    smallObjPic.Dispose();
                    smallObjPic = null;
                    #endregion
    
                }
                catch (Exception exp)
                {
                }
                finally
                {
                    if (objPic != null)
                        objPic.Dispose();
                    if (objNewPic != null)
                        objNewPic.Dispose();
                    if (smallObjPic != null)
                        smallObjPic.Dispose();
                    objPic = null;
                    objNewPic = null;
                    smallObjPic = null;
                }
            }
    
            ///以下函数是处理高度压缩比例大于宽度的情况
            private  void SmallPicW(string strOldPic, string strNewPic, int intHeight, int descWidth)
            {
                System.Drawing.Bitmap objPic, smallObjPic, objNewPic;
                objPic = null;
                objNewPic = null;
                smallObjPic = null;
                try
                {
                    objPic = new System.Drawing.Bitmap(strOldPic);
                    int intWidth = (intHeight * objPic.Width) / objPic.Height;
    
                    smallObjPic = new System.Drawing.Bitmap(objPic, intWidth, intHeight);
                    objNewPic = new System.Drawing.Bitmap(descWidth, intHeight, PixelFormat.Format64bppPArgb);
                    objNewPic.SetResolution(objPic.HorizontalResolution, objPic.VerticalResolution);
                    Graphics grPhoto = Graphics.FromImage(objNewPic);
    
                    if (objPic.Height < intHeight)
                    {//
                        grPhoto.FillRectangle(System.Drawing.Brushes.White, 0, 0, descWidth, intHeight);
                        Rectangle r = new Rectangle((descWidth - objPic.Width) / 2, (intHeight - objPic.Height) / 2,
                        intWidth, objPic.Height);
                        grPhoto.DrawImage(smallObjPic, r);
                    }
                    else
                    {
                        grPhoto.FillRectangle(System.Drawing.Brushes.White, 0, 0, descWidth, intHeight);
                        grPhoto.DrawImage(smallObjPic, new Rectangle((descWidth - intWidth) / 2, 0, intWidth, intHeight),
    , 0, intWidth, intHeight, System.Drawing.GraphicsUnit.Pixel);
                    }
                    #region
                    EncoderParameters encoderParams = new EncoderParameters();
                    long[] quality = new long[1];
                    quality[0] = 90;
                    EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
                    encoderParams.Param[0] = encoderParam;
                    // 
                    ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo jpegICI = null;
                    for (int x = 0; x < arrayICI.Length; x++)
                    {
                        if (arrayICI[x].FormatDescription.Equals("JPEG"))
                        {
                            jpegICI = arrayICI[x];//
                            break;
                        }
                    }
                    if (jpegICI != null)
                    {
                        objNewPic.Save(strNewPic, jpegICI, encoderParams);
                    }
                    else
                    {
                        objNewPic.Save(strNewPic, System.Drawing.Imaging.ImageFormat.Jpeg);
                    }
                    objPic.Dispose();
                    objPic = null;
                    objNewPic.Dispose();
                    objNewPic = null;
                    smallObjPic.Dispose();
                    smallObjPic = null;
                    #endregion
    
                }
                catch (Exception exp)
                {
                    throw exp;
                }
                finally
                {
                    if (objPic != null)
                        objPic.Dispose();
                    if (objNewPic != null)
                        objNewPic.Dispose();
                    if (smallObjPic != null)
                        smallObjPic.Dispose();
                    objPic = null;
                    smallObjPic = null;
                    objNewPic = null;
                }
            }
    
        }
    }
  • 相关阅读:
    【BSP视频教程】STM32H7视频教程第4期:从启动到运行过程全解析,电源域,复位,时钟,软硬件启动流程到堆栈,map和htm文件分析(20220126)
    硬核调试实操 | 手把手带你实现 Serverless 断点调试
    兑现 Service Mesh 的新价值:精确控制“爆炸半径”
    宜搭小技巧|自动计算日期时长,3个公式帮你搞定!
    一文看懂边缘云在广电行业的应用
    Java 定时任务技术趋势
    EventBridge 特性介绍|以 IaC 的方式使用 EventBridge
    15M安装包就能玩《原神》,带你了解云游戏背后的技术秘密
    KubeVela v1.3 多集群初体验,轻松管理应用分发和差异化配置
    如何使用 Serverless Devs 部署静态网站到函数计算(上)
  • 原文地址:https://www.cnblogs.com/diulela/p/2854104.html
Copyright © 2020-2023  润新知