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;
            }
        }

    }
}

 

posted on 2013-01-10 10:00  飞舞的蒲公英  阅读(578)  评论(0编辑  收藏  举报