九宫格水印类

九宫格水印
public class WaterPicture
{
/// <summary>
/// 加图片水印
/// </summary>
/// <param name="img">来源System.Drawing.Image对象</param>
/// <param name="filename">完成后保存文件路径(物理路径)</param>
/// <param name="watermarkFilename">水印文件路径(物理路径)</param>
/// <param name="watermarkStatus">图片水印位置(9宫格位置1-9)</param>
/// <param name="quality">图片质量(1-100)</param>
/// <param name="watermarkTransparency">透明度(1-10)</param>
public static void AddImageSignPic(Image img, string filename, string watermarkFilename, int watermarkStatus, int quality, int watermarkTransparency)
{
Graphics g
= Graphics.FromImage(img);
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="filename">文件名</param>
/// <param name="watermarkText">水印文字</param>
/// <param name="watermarkStatus">图片水印位置</param>
public static void AddImageSignText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize)
{

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


/// <summary>
///(重载) 增加图片文字水印
/// </summary>
/// <param name="filename">文件名</param>
/// <param name="watermarkText">水印文字</param>
/// <param name="watermarkStatus">图片水印位置</param>
/// <param name="fontcolor">图片水印颜色</param>
public static void AddImageSignText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize, string fontcolor)
{

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(ColorTranslator.FromHtml(fontcolor)), xpos, ypos);
//g.DrawString(watermarkText, drawFont, new SolidBrush(Color.FromName(fontcolor)), 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();
}

}
原文地址:https://www.cnblogs.com/cancer_xu/p/1686915.html