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;

            }

        }



    }

}

 

你可能感兴趣的:(graphics)