• 图片处理(给图片加水印)


     using System;
     using System.Collections.Generic;
     using System.Text;
     using System.Drawing;
     using System.Drawing.Drawing2D;
     using System.Drawing.Imaging;
     using System.IO;
     
     namespace Loskiv.Utility
     {
         /**//// <summary>
         /// 名称:图片处理常用操作类
         /// 作者:loskiv
         /// 创建时间:2009-07-07
         /// </summary>
         public class ImageUtility
         {
     
             /**//// <summary>
             /// 获取指定mimeType的ImageCodecInfo
             /// </summary>
             private static ImageCodecInfo GetImageCodecInfo(string mimeType)
             {
                 ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
                 foreach (ImageCodecInfo ici in CodecInfo)
                 {
                     if (ici.MimeType == mimeType) return ici;
                 }
                 return null;
             }
     
             /**//// <summary>
             ///  获取inputStream中的Bitmap对象
             /// </summary>
             public static Bitmap GetBitmapFromStream(Stream inputStream)
             {
                 Bitmap bitmap = new Bitmap(inputStream);
                 return bitmap;
             }
     
             /**//// <summary>
             /// 将Bitmap对象压缩为JPG图片类型
             /// </summary>
             /// </summary>
             /// <param name="bmp">源bitmap对象</param>
             /// <param name="saveFilePath">目标图片的存储地址</param>
             /// <param name="quality">压缩质量,越大照片越清晰,推荐80</param>
             public static void CompressAsJPG(Bitmap bmp, string saveFilePath, int quality)
             {
                 EncoderParameter p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); ;
                 EncoderParameters ps = new EncoderParameters(1);
                 ps.Param[0] = p;
                 bmp.Save(saveFilePath, GetImageCodecInfo("image/jpeg"), ps);
                 bmp.Dispose();
             }
     
             /**//// <summary>
             /// 将inputStream中的对象压缩为JPG图片类型
             /// </summary>
             /// <param name="inputStream">源Stream对象</param>
             /// <param name="saveFilePath">目标图片的存储地址</param>
             /// <param name="quality">压缩质量,越大照片越清晰,推荐80</param>
             public static void CompressAsJPG(Stream inputStream, string saveFilePath, int quality)
             {
                 Bitmap bmp = GetBitmapFromStream(inputStream);
                 CompressAsJPG(bmp, saveFilePath, quality);
             }
     
     
             /**//// <summary>
             /// 生成缩略图(JPG 格式)
             /// </summary>
             /// <param name="inputStream">包含图片的Stream</param>
             /// <param name="saveFilePath">目标图片的存储地址</param>
             /// <param name="width">缩略图的宽</param>
             /// <param name="height">缩略图的高</param>
             public static void ThumbAsJPG(Stream inputStream, string saveFilePath, int width, int height)
             {
                 Image image = Image.FromStream(inputStream);
                 if (image.Width == width && image.Height == height)
                 {
                     CompressAsJPG(inputStream, saveFilePath, 80);
                 }
                 int tWidth, tHeight, tLeft, tTop;
                 double fScale = (double)height / (double)width;
                 if (((double)image.Width * fScale) > (double)image.Height)
                 {
                     tWidth = width;
                     tHeight = (int)((double)image.Height * (double)tWidth / (double)image.Width);
                     tLeft = 0;
                     tTop = (height - tHeight) / 2;
                 }
                 else
                 {
                     tHeight = height;
                     tWidth = (int)((double)image.Width * (double)tHeight / (double)image.Height);
                     tLeft = (width - tWidth) / 2;
                     tTop = 0;
                 }
                if (tLeft < 0) tLeft = 0;
                if (tTop < 0) tTop = 0;
    
                Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
                Graphics graphics = Graphics.FromImage(bitmap);
    
                //可以在这里设置填充背景颜色
                graphics.Clear(Color.White);
                graphics.DrawImage(image, new Rectangle(tLeft, tTop, tWidth, tHeight));
                image.Dispose();
                try
                {
                    CompressAsJPG(bitmap, saveFilePath, 80);
                }
                catch
                {
                    ;
                }
                finally
                {
                    bitmap.Dispose();
                    graphics.Dispose();
                }
            }
    
            /**//// <summary>
            /// 将Bitmap对象裁剪为指定JPG文件
            /// </summary>
            /// <param name="bmp">源bmp对象</param>
            /// <param name="saveFilePath">目标图片的存储地址</param>
           /// <param name="x">开始坐标x,单位:像素</param>
            /// <param name="y">开始坐标y,单位:像素</param>
           /// <param name="width">宽度:像素</param>
            /// <param name="height">高度:像素</param>
            public static void CutAsJPG(Bitmap bmp, string saveFilePath, int x, int y, int width, int height)
            {
                int bmpW = bmp.Width;
                int bmpH = bmp.Height;
    
                if (x >= bmpW || y >= bmpH)
                {
                    CompressAsJPG(bmp, saveFilePath, 80);
                    return;
                }
    
                if (x + width > bmpW)
                {
                    width = bmpW - x;
                }
    
                if (y + height > bmpH)
                {
                    height = bmpH - y;
                }
    
                Bitmap bmpOut = new Bitmap(width, height, PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(bmpOut);
                g.DrawImage(bmp, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
                g.Dispose();
                bmp.Dispose();
                CompressAsJPG(bmpOut, saveFilePath, 80);
            }
    
            /**//// <summary>
            /// 将Stream中的对象裁剪为指定JPG文件
            /// </summary>
            /// <param name="inputStream">源bmp对象</param>
            /// <param name="saveFilePath">目标图片的存储地址</param>
            /// <param name="x">开始坐标x,单位:像素</param>
            /// <param name="y">开始坐标y,单位:像素</param>
            /// <param name="width">宽度:像素</param>
            /// <param name="height">高度:像素</param>
            public static void CutAsJPG(Stream inputStream, string saveFilePath, int x, int y, int width, int height)
            {
               Bitmap bmp = GetBitmapFromStream(inputStream);
                CutAsJPG(bmp, saveFilePath, x, y, width, height);
            }
    
    
           图片水印操作#region 图片水印操作
    
            /**//// <summary>
            /// 给图片添加图片水印
            /// </summary>
            /// <param name="inputStream">包含要源图片的流</param>
            /// <param name="watermarkPath">水印图片的物理地址</param>
            /// <param name="saveFilePath">目标图片的存储地址</param>
            /// <param name="mp">水印位置</param>
            public static void AddPicWatermarkAsJPG(Stream inputStream, string watermarkPath, string saveFilePath, MarkPosition mp)
            {
    
                Image image = Image.FromStream(inputStream);
                Bitmap b = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(b);
                g.Clear(Color.White);
               g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.High;
               g.DrawImage(image, 0, 0, image.Width, image.Height);
    
                AddWatermarkImage(g, watermarkPath, mp, image.Width, image.Height);
                try
                {
                    CompressAsJPG(b, saveFilePath, 80);
                }
                catch { ;}
                finally
                {
                    b.Dispose();
                    image.Dispose();
                }
           }
    
            /**//// <summary>
            /// 给图片添加图片水印
            /// </summary>
            /// <param name="sourcePath">源图片的存储地址</param>
            /// <param name="watermarkPath">水印图片的物理地址</param>
            /// <param name="saveFilePath">目标图片的存储地址</param>
            /// <param name="mp">水印位置</param>
            public static void AddPicWatermarkAsJPG(string sourcePath, string watermarkPath, string saveFilePath, MarkPosition mp)
           {
                if (File.Exists(sourcePath))
               {
                    using (StreamReader sr = new StreamReader(sourcePath))
                    {
                        AddPicWatermarkAsJPG(sr.BaseStream, watermarkPath, saveFilePath, mp);
                    }
                }
            }
            /**//// <summary>
            /// 给图片添加文字水印        /// </summary>
            /// <param name="inputStream">包含要源图片的流</param>
            /// <param name="text">水印文字</param>
            /// <param name="saveFilePath">目标图片的存储地址</param>
            /// <param name="mp">水印位置</param>
            public static void AddTextWatermarkAsJPG(Stream inputStream, string text, string saveFilePath, MarkPosition mp)
            {
    
                Image image = Image.FromStream(inputStream);
                Bitmap b = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(b);
                g.Clear(Color.White);
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.High;
                g.DrawImage(image, 0, 0, image.Width, image.Height);
    
                AddWatermarkText(g, text, mp, image.Width, image.Height);
    
                try
                {
                    CompressAsJPG(b, saveFilePath, 80);
                }
                catch { ;}
                finally
                {
                    b.Dispose();
                    image.Dispose();
                }
            }
    
            /**//// <summary>
            /// 给图片添加文字水印
            /// </summary>
            /// <param name="sourcePath">源图片的存储地址</param>
            /// <param name="text">水印文字</param>
            /// <param name="saveFilePath">目标图片的存储地址</param>
            /// <param name="mp">水印位置</param>
            public static void AddTextWatermarkAsJPG(string sourcePath, string text, string saveFilePath, MarkPosition mp)
            {
                if (File.Exists(sourcePath))
                {
                    using (StreamReader sr = new StreamReader(sourcePath))
                    {
                        AddTextWatermarkAsJPG(sr.BaseStream, text, saveFilePath, mp);
                    }
                }
            }
    
            /**//// <summary>
            /// 添加文字水印
            /// </summary>
            /// <param name="picture">要加水印的原图像</param>
            /// <param name="text">水印文字</param>
            /// <param name="mp">添加的位置</param>
            /// <param name="width">原图像的宽度</param>
            /// <param name="height">原图像的高度</param>
            private static void AddWatermarkText(Graphics picture, string text, MarkPosition mp, int width, int height)
            {
                int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4 };
                Font crFont = null;
                SizeF crSize = new SizeF();
                for (int i = 0; i < 7; i++)
                {
                    crFont = new Font("Arial", sizes[i], FontStyle.Bold);
                    crSize = picture.MeasureString(text, crFont);
    
                    if ((ushort)crSize.Width < (ushort)width)
                        break;
                }
    
                float xpos = 0;
                float ypos = 0;
    
                switch (mp)
                {
                    case MarkPosition.MP_Left_Top:
                        xpos = ((float)width * (float).01) + (crSize.Width / 2);
                        ypos = (float)height * (float).01;
                        break;
                    case MarkPosition.MP_Right_Top:
                        xpos = ((float)width * (float).99) - (crSize.Width / 2);
                        ypos = (float)height * (float).01;
                        break;
                    case MarkPosition.MP_Right_Bottom:
                        xpos = ((float)width * (float).99) - (crSize.Width / 2);
                        ypos = ((float)height * (float).99) - crSize.Height;
                        break;
                    case MarkPosition.MP_Left_Bottom:
                        xpos = ((float)width * (float).01) + (crSize.Width / 2);
                        ypos = ((float)height * (float).99) - crSize.Height;
                        break;
                }
    
                StringFormat StrFormat = new StringFormat();
                StrFormat.Alignment = StringAlignment.Center;
    
                SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0));
                picture.DrawString(text, crFont, semiTransBrush2, xpos + 1, ypos + 1, StrFormat);
    
                SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));
                picture.DrawString(text, crFont, semiTransBrush, xpos, ypos, StrFormat);
    
                semiTransBrush2.Dispose();
                semiTransBrush.Dispose();
    
            }
    
            /**//// <summary>
            /// 添加图片水印
            /// </summary>
            /// <param name="picture">要加水印的原图像</param>
            /// <param name="waterMarkPath">水印文件的物理地址</param>
            /// <param name="mp">添加的位置</param>
            /// <param name="width">原图像的宽度</param>
            /// <param name="height">原图像的高度</param>
            private static void AddWatermarkImage(Graphics picture, string waterMarkPath, MarkPosition mp, int width, int height)
            {
                Image watermark = new Bitmap(waterMarkPath);
    
                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,  0.3f, 0.0f},
                                                     new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}
                                                 };
    
                ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
    
                imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
    
                int xpos = 0;
                int ypos = 0;
                int WatermarkWidth = 0;
                int WatermarkHeight = 0;
                double bl = 1d;
                if ((width > watermark.Width * 4) && (height > watermark.Height * 4))
                {
                    bl = 1;
                }
                else if ((width > watermark.Width * 4) && (height < watermark.Height * 4))
                {
                    bl = Convert.ToDouble(height / 4) / Convert.ToDouble(watermark.Height);
    
                }
                else
    
                    if ((width < watermark.Width * 4) && (height > watermark.Height * 4))
                    {
                        bl = Convert.ToDouble(width / 4) / Convert.ToDouble(watermark.Width);
                    }
                    else
                    {
                        if ((width * watermark.Height) > (height * watermark.Width))
                        {
                            bl = Convert.ToDouble(height / 4) / Convert.ToDouble(watermark.Height);
    
                        }
                        else
                        {
                            bl = Convert.ToDouble(width / 4) / Convert.ToDouble(watermark.Width);
    
                        }
    
                    }
    
                WatermarkWidth = Convert.ToInt32(watermark.Width * bl);
                WatermarkHeight = Convert.ToInt32(watermark.Height * bl);
    
    
                switch (mp)
                {
                    case MarkPosition.MP_Left_Top:
                        xpos = 10;
                        ypos = 10;
                        break;
                    case MarkPosition.MP_Right_Top:
                        xpos = width - WatermarkWidth - 10;
                        ypos = 10;
                        break;
                    case MarkPosition.MP_Right_Bottom:
                        xpos = width - WatermarkWidth - 10;
                        ypos = height - WatermarkHeight - 10;
                        break;
                    case MarkPosition.MP_Left_Bottom:
                        xpos = 10;
                        ypos = height - WatermarkHeight - 10;
                        break;
                }
    
                picture.DrawImage(watermark, new Rectangle(xpos, ypos, WatermarkWidth, WatermarkHeight), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
    
    
                watermark.Dispose();
                imageAttributes.Dispose();
            }
    
            /**//// <summary>
            /// 水印的位置
            /// </summary>        public enum MarkPosition
            {
                /**//// <summary>
                /// 左上角
                /// </summary>
                MP_Left_Top,
    
                /**//// <summary>
                /// 左下角
                /// </summary>
                MP_Left_Bottom,
    
                /**//// <summary>
                /// 右上角
                /// </summary>
                MP_Right_Top,
    
                /**//// <summary>
                /// 右下角
                /// </summary>
                MP_Right_Bottom
            }
    
    
            #endregion
    
        }
    }
    
  • 相关阅读:
    【一个蒟蒻的挣扎】单源最短路(Dijkstra)
    【字符串大模拟】潜伏者—— NOIP2009原题
    【一个蒟蒻的挣扎】最长上升子序列
    【球的序列】——最长上升子序列
    【洛谷P1886】滑动窗口——单调队列
    【实时更新】你永远都不会想到上了考场会犯什么样的**错误——汇总
    【洛谷P1816】忠诚——ST表做法
    【一道来自老师的题的题解】equip——奇妙的最短路
    【洛谷P1119题解】灾后重建——(floyd)
    济南集训总结
  • 原文地址:https://www.cnblogs.com/pbuilder/p/1570122.html
Copyright © 2020-2023  润新知