zoukankan      html  css  js  c++  java
  • C#图片水印代码整理

    这一段公司有个项目,客户要求上传的图片要带上自定义的水印。以前也经常和朋友讨论C#图片水印方面的问题,但是从来没有实际操作过。所以,借这次项目的机会也研究了一下C#图片水印的功能!本人参考的是discuz论坛中的代码。这种方法是直接把要上传的图片先转化成System.Drawing.Image,而不用保存到服务器端的磁盘上,然后加上水印重新绘制,再保存到服务器端的磁盘上,下面就拿出来晒晒:

    1 /// <summary>
    2 /// 加图片水印
    3 /// </summary>
    4 /// <param name="img">要加水印的原图(System.Drawing)</param>
    5 /// <param name="filename">文件名</param>
    6 /// <param name="watermarkFilename">水印文件名</param>
    7 /// <param name="watermarkStatus">图片水印位置1=左上 2=中上 3=右上 4=左中 5=中中 6=右中 7=左下 8=右中 9=右下</param>
    8 /// <param name="quality">加水印后的质量0~100,数字越大质量越高</param>
    9 /// <param name="watermarkTransparency">水印图片的透明度1~10,数字越小越透明,10为不透明</param>
    10   public static void ImageWaterMarkPic(Image img, string filename, string watermarkFilename, int watermarkStatus, int quality, int watermarkTransparency)
    11 {
    12 Graphics g = Graphics.FromImage(img);
    13 //设置高质量插值法
    14 //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    15 //设置高质量,低速度呈现平滑程度
    16 //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    17 Image watermark = new Bitmap(watermarkFilename);
    18
    19 if (watermark.Height >= img.Height || watermark.Width >= img.Width)
    20 return;
    21
    22 ImageAttributes imageAttributes = new ImageAttributes();
    23 ColorMap colorMap = new ColorMap();
    24
    25 colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
    26 colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
    27 ColorMap[] remapTable = { colorMap };
    28
    29 imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
    30
    31 float transparency = 0.5F;
    32 if (watermarkTransparency >= 1 && watermarkTransparency <= 10)
    33 transparency = (watermarkTransparency / 10.0F);
    34
    35
    36 float[][] colorMatrixElements = {
    37 new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
    38 new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
    39 new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
    40 new float[] {0.0f, 0.0f, 0.0f, transparency, 0.0f},
    41 new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
    42 };
    43
    44 ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
    45
    46 imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
    47
    48 int xpos = 0;
    49 int ypos = 0;
    50
    51 switch (watermarkStatus)
    52 {
    53 case 1:
    54 xpos = (int)(img.Width * (float).01);
    55 ypos = (int)(img.Height * (float).01);
    56 break;
    57 case 2:
    58 xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
    59 ypos = (int)(img.Height * (float).01);
    60 break;
    61 case 3:
    62 xpos = (int)((img.Width * (float).99) - (watermark.Width));
    63 ypos = (int)(img.Height * (float).01);
    64 break;
    65 case 4:
    66 xpos = (int)(img.Width * (float).01);
    67 ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
    68 break;
    69 case 5:
    70 xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
    71 ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
    72 break;
    73 case 6:
    74 xpos = (int)((img.Width * (float).99) - (watermark.Width));
    75 ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
    76 break;
    77 case 7:
    78 xpos = (int)(img.Width * (float).01);
    79 ypos = (int)((img.Height * (float).99) - watermark.Height);
    80 break;
    81 case 8:
    82 xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
    83 ypos = (int)((img.Height * (float).99) - watermark.Height);
    84 break;
    85 case 9:
    86 xpos = (int)((img.Width * (float).99) - (watermark.Width));
    87 ypos = (int)((img.Height * (float).99) - watermark.Height);
    88 break;
    89 }
    90
    91 g.DrawImage(watermark, new Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
    92
    93 ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
    94 ImageCodecInfo ici = null;
    95 foreach (ImageCodecInfo codec in codecs)
    96 {
    97 if (codec.MimeType.IndexOf("jpeg") > -1)
    98 ici = codec;
    99 }
    100 EncoderParameters encoderParams = new EncoderParameters();
    101 long[] qualityParam = new long[1];
    102 if (quality < 0 || quality > 100)
    103 quality = 80;
    104
    105 qualityParam[0] = quality;
    106
    107 EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
    108 encoderParams.Param[0] = encoderParam;
    109
    110 if (ici != null)
    111 img.Save(filename, ici, encoderParams);
    112 else
    113 img.Save(filename);
    114
    115 g.Dispose();
    116 img.Dispose();
    117 watermark.Dispose();
    118 imageAttributes.Dispose();
    119 }
    120
    121 /// <summary>
    122 /// 增加图片文字水印
    123 /// </summary>
    124 /// <param name="img">要加水印的原图(System.Drawing)</param>
    125 /// <param name="filename">文件名</param>
    126 /// <param name="watermarkText">水印文字</param>
    127 /// <param name="watermarkStatus">图片水印位置1=左上 2=中上 3=右上 4=左中 5=中中 6=右中 7=左下 8=右中 9=右下</param>
    128 /// <param name="quality">加水印后的质量0~100,数字越大质量越高</param>
    129 /// <param name="fontname">水印的字体</param>
    130 /// <param name="fontsize">水印的字号</param>
    131 public static void ImageWaterMarkText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize)
    132 {
    133 Graphics g = Graphics.FromImage(img);
    134 Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel);
    135 SizeF crSize;
    136 crSize = g.MeasureString(watermarkText, drawFont);
    137
    138 float xpos = 0;
    139 float ypos = 0;
    140
    141 switch (watermarkStatus)
    142 {
    143 case 1:
    144 xpos = (float)img.Width * (float).01;
    145 ypos = (float)img.Height * (float).01;
    146 break;
    147 case 2:
    148 xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
    149 ypos = (float)img.Height * (float).01;
    150 break;
    151 case 3:
    152 xpos = ((float)img.Width * (float).99) - crSize.Width;
    153 ypos = (float)img.Height * (float).01;
    154 break;
    155 case 4:
    156 xpos = (float)img.Width * (float).01;
    157 ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
    158 break;
    159 case 5:
    160 xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
    161 ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
    162 break;
    163 case 6:
    164 xpos = ((float)img.Width * (float).99) - crSize.Width;
    165 ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
    166 break;
    167 case 7:
    168 xpos = (float)img.Width * (float).01;
    169 ypos = ((float)img.Height * (float).99) - crSize.Height;
    170 break;
    171 case 8:
    172 xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
    173 ypos = ((float)img.Height * (float).99) - crSize.Height;
    174 break;
    175 case 9:
    176 xpos = ((float)img.Width * (float).99) - crSize.Width;
    177 ypos = ((float)img.Height * (float).99) - crSize.Height;
    178 break;
    179 }
    180
    181 //g.DrawString(watermarkText, drawFont, new SolidBrush(Color.White), xpos + 1, ypos + 1);文字阴影
    182 g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos);
    183
    184 ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
    185 ImageCodecInfo ici = null;
    186 foreach (ImageCodecInfo codec in codecs)
    187 {
    188 if (codec.MimeType.IndexOf("jpeg") > -1)
    189 ici = codec;
    190 }
    191 EncoderParameters encoderParams = new EncoderParameters();
    192 long[] qualityParam = new long[1];
    193 if (quality < 0 || quality > 100)
    194 quality = 80;
    195
    196 qualityParam[0] = quality;
    197
    198 EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
    199 encoderParams.Param[0] = encoderParam;
    200
    201 if (ici != null)
    202 img.Save(filename, ici, encoderParams);
    203 else
    204 img.Save(filename);
    205
    206 g.Dispose();
    207 img.Dispose();
    208 }
    209

    有什么不足之处,请园友们尽情拍砖!!

  • 相关阅读:
    面试再问ThreadLocal,别说你不会
    利用 Docker Compose 搭建 SpringBoot 运行环境(超详细步骤和分析)
    高并发场景下缓存处理的一些思路!
    利用Dockerfile部署SpringBoot项目
    [RH254] 1-运行级别
    [RH134] 12-系统启动
    [安全] HTTPS的理解
    [工具] Wireshark与相关的网络安全
    [Python自学] 爬虫(5)selenium
    [Python自学] 爬虫(4)xpath
  • 原文地址:https://www.cnblogs.com/zydf/p/1835331.html
Copyright © 2011-2022 走看看