| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- using System;
- using System.Web;
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.Drawing.Drawing2D;
- using System.IO;
- namespace HySoft.Common
- {
- public class WaterMark
- {
- /// <summary>
- /// 图片水印
- /// </summary>
- /// <param name="imgPath">服务器图片相对路径</param>
- /// <param name="filename">保存文件名</param>
- /// <param name="watermarkFilename">水印文件相对路径</param>
- /// <param name="watermarkStatus">图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 9=右下</param>
- /// <param name="quality">附加水印图片质量,0-100</param>
- /// <param name="watermarkTransparency">水印的透明度 1--10 10为不透明</param>
- public static void AddImageSignPic(string imgPath, string filename, string watermarkFilename, int watermarkStatus, int quality, int watermarkTransparency)
- {
- if(!File.Exists(Utils.GetMapPath(imgPath)))
- return;
- byte[] _ImageBytes = File.ReadAllBytes(Utils.GetMapPath(imgPath));
- Image img = Image.FromStream(new System.IO.MemoryStream(_ImageBytes));
- filename = Utils.GetMapPath(filename);
- if (watermarkFilename.StartsWith("/") == false)
- watermarkFilename = "/" + watermarkFilename;
- watermarkFilename = Utils.GetMapPath(watermarkFilename);
- if (!File.Exists(watermarkFilename))
- return;
- Graphics g = Graphics.FromImage(img);
- //设置高质量插值法
- //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
- //设置高质量,低速度呈现平滑程度
- //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- Image watermark = new Bitmap(watermarkFilename);
- if (watermark.Height >= img.Height || watermark.Width >= img.Width)
- return;
- 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 transparency = 0.5F;
- if (watermarkTransparency >= 1 && watermarkTransparency <= 10)
- transparency = (watermarkTransparency / 10.0F);
- 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, transparency, 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;
- switch (watermarkStatus)
- {
- case 1:
- xpos = (int)(img.Width * (float).01);
- ypos = (int)(img.Height * (float).01);
- break;
- case 2:
- xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
- ypos = (int)(img.Height * (float).01);
- break;
- case 3:
- xpos = (int)((img.Width * (float).99) - (watermark.Width));
- ypos = (int)(img.Height * (float).01);
- break;
- case 4:
- xpos = (int)(img.Width * (float).01);
- ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
- break;
- case 5:
- xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
- ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
- break;
- case 6:
- xpos = (int)((img.Width * (float).99) - (watermark.Width));
- ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
- break;
- case 7:
- xpos = (int)(img.Width * (float).01);
- ypos = (int)((img.Height * (float).99) - watermark.Height);
- break;
- case 8:
- xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
- ypos = (int)((img.Height * (float).99) - watermark.Height);
- break;
- case 9:
- xpos = (int)((img.Width * (float).99) - (watermark.Width));
- ypos = (int)((img.Height * (float).99) - watermark.Height);
- break;
- }
- g.DrawImage(watermark, new Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
- ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
- ImageCodecInfo ici = null;
- foreach (ImageCodecInfo codec in codecs)
- {
- if (codec.MimeType.IndexOf("jpeg") > -1)
- ici = codec;
- }
- EncoderParameters encoderParams = new EncoderParameters();
- long[] qualityParam = new long[1];
- if (quality < 0 || quality > 100)
- quality = 80;
- qualityParam[0] = quality;
- EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
- encoderParams.Param[0] = encoderParam;
- if (ici != null)
- img.Save(filename, ici, encoderParams);
- else
- img.Save(filename);
- g.Dispose();
- img.Dispose();
- watermark.Dispose();
- imageAttributes.Dispose();
- }
- /// <summary>
- /// 文字水印
- /// </summary>
- /// <param name="imgPath">服务器图片相对路径</param>
- /// <param name="filename">保存文件名</param>
- /// <param name="watermarkText">水印文字</param>
- /// <param name="watermarkStatus">图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 9=右下</param>
- /// <param name="quality">附加水印图片质量,0-100</param>
- /// <param name="fontname">字体</param>
- /// <param name="fontsize">字体大小</param>
- public static void AddImageSignText(string imgPath, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize)
- {
- byte[] _ImageBytes = File.ReadAllBytes(Utils.GetMapPath(imgPath));
- Image img = Image.FromStream(new System.IO.MemoryStream(_ImageBytes));
- filename = Utils.GetMapPath(filename);
- Graphics g = Graphics.FromImage(img);
- Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel);
- SizeF crSize;
- crSize = g.MeasureString(watermarkText, drawFont);
- float xpos = 0;
- float ypos = 0;
- switch (watermarkStatus)
- {
- case 1:
- xpos = (float)img.Width * (float).01;
- ypos = (float)img.Height * (float).01;
- break;
- case 2:
- xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
- ypos = (float)img.Height * (float).01;
- break;
- case 3:
- xpos = ((float)img.Width * (float).99) - crSize.Width;
- ypos = (float)img.Height * (float).01;
- break;
- case 4:
- xpos = (float)img.Width * (float).01;
- ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
- break;
- case 5:
- xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
- ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
- break;
- case 6:
- xpos = ((float)img.Width * (float).99) - crSize.Width;
- ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
- break;
- case 7:
- xpos = (float)img.Width * (float).01;
- ypos = ((float)img.Height * (float).99) - crSize.Height;
- break;
- case 8:
- xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
- ypos = ((float)img.Height * (float).99) - crSize.Height;
- break;
- case 9:
- xpos = ((float)img.Width * (float).99) - crSize.Width;
- ypos = ((float)img.Height * (float).99) - crSize.Height;
- break;
- }
- g.DrawString(watermarkText, drawFont, new SolidBrush(Color.White), xpos + 1, ypos + 1);
- g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos);
- ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
- ImageCodecInfo ici = null;
- foreach (ImageCodecInfo codec in codecs)
- {
- if (codec.MimeType.IndexOf("jpeg") > -1)
- ici = codec;
- }
- EncoderParameters encoderParams = new EncoderParameters();
- long[] qualityParam = new long[1];
- if (quality < 0 || quality > 100)
- quality = 80;
- qualityParam[0] = quality;
- EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
- encoderParams.Param[0] = encoderParam;
- if (ici != null)
- img.Save(filename, ici, encoderParams);
- else
- img.Save(filename);
- g.Dispose();
- img.Dispose();
- }
- }
- }
|