zoukankan      html  css  js  c++  java
  • C#给图片加文字和图片的水印

        /// <summary> 
        /// WaterMark 的摘要说明 
        /// </summary> 
        /// 图片加水印
        /// <param name="strCopyright">要加入的文字 </param>
        /// <param name="strMarkPath">水印图片路径 </param>
        /// <param name="strPhotoPath">要加水印的图片路径 </param>
        /// <param name="strSavePath">处理后的图片路径 </param>
        /// <param name="iMarkRightSpace">水印在修改图片中距右边的宽度 </param>
        /// <param name="iMarkButtomSpace">水印在修改图片中距底部的高度 </param>
        /// <param name="iDiaphaneity">水印图片的透明度 </param>
        /// <param name="iFontRightSpace">文字 </param>
        /// <param name="iFontButtomSpace">文字 </param>
        /// <param name="iFontDiaphaneity">文字 </param>
        /// <param name="bShowCopyright">是否显示文字 </param>
        /// <param name="bShowMarkImage">是否显示水印图片 </param>
        public class WaterMark
        {
            #region  param
    
    
            private string strCopyright, strMarkPath, strPhotoPath, strSavePath;
            private int iMarkRightSpace, iMarkButtomSpace, iDiaphaneity;
            private int iFontRightSpace = 0, iFontButtomSpace = 0, iFontDiaphaneity = 80;
            private int iFontSize = 10;
            private bool bShowCopyright = true, bShowMarkImage = true;
    
    
            #endregion
    
    
            #region WaterMark
    
    
            public WaterMark()
            {
                this.strCopyright = "";
                this.strMarkPath = null;
                this.strPhotoPath = null;
                this.strSavePath = null;
                this.iDiaphaneity = 70;
                this.iMarkRightSpace = 0;
                this.iMarkButtomSpace = 0;
            }
    
    
            /// <summary> 
            /// 主要用两样都加的
            /// </summary> 
            public WaterMark(string copyright, string markPath, string photoPath, string savePath)
            {
                this.strCopyright = copyright;
                this.strMarkPath = markPath;
                this.strPhotoPath = photoPath;
                this.strSavePath = savePath;
                this.iDiaphaneity = 70;
                this.iMarkRightSpace = 0;
                this.iMarkButtomSpace = 0;
            }
    
    
            #endregion
    
    
            #region property
    
    
            /// <summary> 
            /// 设置是否显示水印文字
            /// </summary> 
            public bool ShowCopyright
            {
                set { this.bShowCopyright = value; }
            }
    
    
            /// <summary> 
            /// 设置是否显示水印图片
            /// </summary> 
            public bool ShowMarkImage
            {
                set { this.bShowMarkImage = value; }
            }
            /// <summary> 
            /// 获取或设置要加入的文字
            /// </summary> 
            public string Copyright
            {
                set { this.strCopyright = value; }
            }
    
    
            /// <summary> 
            /// 获取或设置加水印后的图片路径
            /// </summary> 
            public string SavePath
            {
                get { return this.strSavePath; }
                set { this.strSavePath = value; }
            }
    
    
            /// <summary> 
            /// 获取或设置水印图片路径
            /// </summary> 
            public string MarkPath
            {
                get { return this.strMarkPath; }
                set { this.strMarkPath = value; }
            }
    
    
            /// <summary> 
            /// 获取或设置要加水印图片的路径
            /// </summary> 
            public string PhotoPath
            {
                get { return this.strPhotoPath; }
                set { this.strPhotoPath = value; }
            }
    
    
            /// <summary> 
            /// 设置水印图片的透明度
            /// </summary> 
            public int Diaphaneity
            {
                set
                {
                    if (value > 0 && value <= 100)
                        this.iDiaphaneity = value;
                }
            }
    
    
            /// <summary> 
            /// 设置水印字体的透明度0-255
            /// </summary> 
            public int FontDiaphaneity
            {
                set
                {
                    if (value >= 0 && value <= 255)
                        this.iFontDiaphaneity = value;
                }
            }
    
    
            /// <summary> 
            /// 设置水印图片在修改图片中距左边的高度
            /// </summary> 
            public int MarkRightSpace
            {
                set { this.iMarkRightSpace = value; }
            }
    
    
            /// <summary> 
            /// 设置水印图片在修改图片中距底部的高度
            /// </summary> 
            public int MarkButtomSpace
            {
                set { this.iMarkButtomSpace = value; }
            }
    
    
            /// <summary> 
            /// 设置水印字体在修改图片中距左边的距离
            /// </summary> 
            public int FontRightSpace
            {
                set { iFontRightSpace = value; }
            }
    
    
            /// <summary> 
            /// 设置水印字体在修改图片中距底部的高度
            /// </summary> 
            public int FontButtomSpace
            {
                set { iFontButtomSpace = value; }
            }
    
    
            #endregion
    
    
    
    
            /// <summary> 
            /// 生成水印图片
            /// </summary> 
            /// <returns> </returns> 
            public void createMarkPhoto()
            {
                Bitmap bmWatermark = null;
                FileStream fileStream = new FileStream(this.strPhotoPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                Image gPhoto = Image.FromStream(fileStream);
                int PhotoWidth = gPhoto.Width;
                int PhotoHeight = gPhoto.Height;
                //Bitmap bitPhoto = new Bitmap(PhotoWidth, PhotoHeight, PixelFormat.Format24bppRgb);
                Bitmap bitPhoto = new Bitmap(PhotoWidth, PhotoHeight);
                bitPhoto.SetResolution(gPhoto.HorizontalResolution, gPhoto.VerticalResolution);
    
    
                try
                {
                    if (bShowCopyright)
                    {
                        Graphics grPhoto = Graphics.FromImage(bitPhoto);
                        //grPhoto.SmoothingMode = SmoothingMode.AntiAlias;//这句代码的作用是让合成模式为自动反锯齿,也就是所谓的"模糊"
                        grPhoto.DrawImage(gPhoto, new Rectangle(0, 0, PhotoWidth, PhotoHeight), 0, 0, PhotoWidth, PhotoHeight, GraphicsUnit.Pixel);
    
    
                        Font crFont = new Font("楷体", iFontSize, FontStyle.Bold);
                        SizeF crSize = grPhoto.MeasureString(strCopyright, crFont);
    
    
                        //设置字体在图片中的位置
                        float yPosFromBottom = PhotoHeight - iFontButtomSpace - (crSize.Height);
    
    
                        //float xCenterOfImg = (phWidth/2);
                        float xCenterOfImg = PhotoWidth - iFontRightSpace - (crSize.Width / 2);
                        //设置字体居中
    
    
                        StringFormat StrFormat = new StringFormat();
                        StrFormat.Alignment = StringAlignment.Center;
    
    
                        //设置绘制文本的颜色和纹理 (Alpha=153)
                        SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(this.iFontDiaphaneity, 0, 0, 0));
    
    
                        //将版权信息绘制到图象上
                        grPhoto.DrawString(strCopyright, crFont, semiTransBrush2, new PointF(xCenterOfImg, yPosFromBottom), StrFormat);
    
    
                        gPhoto = bitPhoto;
                        grPhoto.Dispose();
                    }
    
    
                    if (bShowMarkImage)
                    {
                        //创建一个需要填充水银的Image对象
                        Image imgWatermark = new Bitmap(strMarkPath);
                        int iMarkWidth = imgWatermark.Width;
                        int iMarkmHeight = imgWatermark.Height;
    
    
                        Graphics grWatermark = null;
                        if (bShowCopyright)
                        {
                            //在原来修改过的bmPhoto上创建一个水银位图
                            bmWatermark = new Bitmap(bitPhoto);
                            bmWatermark.SetResolution(gPhoto.HorizontalResolution, gPhoto.VerticalResolution);
                        }
                        else
                        {
                            bmWatermark = new Bitmap(gPhoto);
                        }
    
    
                        //将位图bmWatermark加载到Graphics对象
                        grWatermark = Graphics.FromImage(bmWatermark);
                        ImageAttributes imageAttributes = new ImageAttributes();
    
    
                        ColorMap colorMap = new ColorMap();
    
    
                        colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
                        colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
    
    
                        ColorMap[] remapTable = { colorMap };
    
    
                        imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
    
    
                        float[][] colorMatrixElements = {
                            new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
                            new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
                            new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
                            new float[] {0.0f, 0.0f, 0.0f, (float)iDiaphaneity/100f, 0.0f},
                            new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}};
                        ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
                        imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                        grWatermark.DrawImage(imgWatermark, new Rectangle((PhotoWidth - iMarkRightSpace - (iMarkWidth / 2)), (PhotoHeight - iMarkButtomSpace - (iMarkmHeight / 2)), iMarkWidth, iMarkmHeight), 0, 0, iMarkWidth, iMarkmHeight, GraphicsUnit.Pixel, imageAttributes);
    
    
                        gPhoto = bmWatermark;
                        grWatermark.Dispose();
                        imgWatermark.Dispose();
                    }
                    //设置输出图片质量,默认输出是60%的清晰度
                    EncoderParameter ep = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
                    EncoderParameters eps = new EncoderParameters(1);
                    eps.Param[0] = ep;
                    ImageCodecInfo ic = GetCodecInfo("image/jpeg");
                    fileStream.Close();
                    gPhoto.Save(strSavePath, ic, eps);
                    bmWatermark.Dispose();
                    bitPhoto.Dispose();
                    gPhoto.Dispose();
                    ep.Dispose();
                    eps.Dispose();
                }
                finally
                {
                    if (bitPhoto != null)
                        bitPhoto.Dispose();
                    if (bmWatermark != null)
                        bmWatermark.Dispose();
                    fileStream.Close();
                    gPhoto.Dispose();
                }
            }
    
    
            private ImageCodecInfo GetCodecInfo(String mimeType)
            {
                ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
                foreach (ImageCodecInfo ici in CodecInfo)
                {
                    if (ici.MimeType == mimeType) return ici;
                }
                return null;
            }
        }
  • 相关阅读:
    安装Kali Linux虚拟机02
    前端入门之——知识补充 day11
    套接字编程知识回顾01
    关于js中 document.body.scrollTop 不能返回正确值的原因
    前端入门之——后台管理页面布局 学习 day10
    前端入门之——jquery day9
    pickle序列化与反序列化 + eval说明
    json序列化与反序列化
    项目中日志输出常用的设置
    logging模块基础3
  • 原文地址:https://www.cnblogs.com/blazeZzz/p/9558046.html
Copyright © 2011-2022 走看看