首先定义水印生成类:
public class ImageWatermark
{
public static Image CreateWatermark(
string fileName,
string markStr,
Font font,
Color color,
float opacity,
ContentAlignment markAlign)
{
return CreateWatermark(
Image.FromFile(fileName),
markStr,
font,
color,
opacity,
markAlign);
}
public static Image CreateWatermark(
Image image,
string markStr,
Font font,
Color color,
float opacity,
ContentAlignment markAlign)
{
if (image == null)
{
throw new ArgumentNullException("iamge");
}
if (font == null)
{
font = new Font("宋体", 12F, FontStyle.Bold, GraphicsUnit.Point, 134);
}
if (string.IsNullOrEmpty(markStr))
{
return image;
}
Rectangle textRect = new Rectangle(Point.Empty, image.Size);
StringFormat sf = new StringFormat();
sf.Trimming = StringTrimming.EllipsisCharacter;
switch (markAlign)
{
case ContentAlignment.TopLeft:
sf.LineAlignment = StringAlignment.Near;
sf.Alignment = StringAlignment.Near;
break;
case ContentAlignment.TopCenter:
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Near;
break;
case ContentAlignment.TopRight:
sf.LineAlignment = StringAlignment.Far;
sf.Alignment = StringAlignment.Near;
break;
case ContentAlignment.MiddleLeft:
sf.LineAlignment = StringAlignment.Near;
sf.Alignment = StringAlignment.Center;
break;
case ContentAlignment.MiddleCenter:
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
break;
case ContentAlignment.MiddleRight:
sf.LineAlignment = StringAlignment.Far;
sf.Alignment = StringAlignment.Center;
break;
case ContentAlignment.BottomLeft:
sf.LineAlignment = StringAlignment.Near;
sf.Alignment = StringAlignment.Far;
break;
case ContentAlignment.BottomCenter:
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Far;
break;
case ContentAlignment.BottomRight:
sf.LineAlignment = StringAlignment.Far;
sf.Alignment = StringAlignment.Far;
break;
}
Bitmap bmp = new Bitmap(image);
color = Color.FromArgb((int)(255 * opacity), color);
using (Graphics g = Graphics.FromImage(bmp))
{
g.TextRenderingHint = TextRenderingHint.AntiAlias;
using (SolidBrush brush = new SolidBrush(color))
{
g.DrawString(
markStr,
font,
brush,
textRect,
sf);
}
g.Flush();
}
return bmp;
}
public static Image CreateWatermark(
string fileName,
string markFileName,
Size markSize,
float opacity,
ContentAlignment markAlign)
{
return CreateWatermark(
Image.FromFile(fileName),
Image.FromFile(markFileName),
markSize,
opacity,
markAlign);
}
public static Image CreateWatermark(
Image image,
Image markImage,
Size markSize,
float opacity,
ContentAlignment markAlign)
{
if (image == null)
{
throw new ArgumentNullException("iamge");
}
if (markImage == null)
{
throw new ArgumentNullException("maskImage");
}
if (markSize == Size.Empty)
{
markSize = markImage.Size;
}
int width = image.Width;
int height = image.Height;
Rectangle maskRect = new Rectangle(Point.Empty, markSize);
switch (markAlign)
{
case ContentAlignment.TopLeft:
maskRect.X = 2;
maskRect.Y = 2;
break;
case ContentAlignment.TopCenter:
maskRect.X = (width - markSize.Width) / 2;
maskRect.Y = 2;
break;
case ContentAlignment.TopRight:
maskRect.X = width - markSize.Width - 2;
maskRect.Y = 2;
break;
case ContentAlignment.MiddleLeft:
maskRect.X = 2;
maskRect.Y = (height - markSize.Height) / 2;
break;
case ContentAlignment.MiddleCenter:
maskRect.X = (width - markSize.Width) / 2;
maskRect.Y = (height - markSize.Height) / 2;
break;
case ContentAlignment.MiddleRight:
maskRect.X = width - markSize.Width - 2;
maskRect.Y = (height - markSize.Height) / 2;
break;
case ContentAlignment.BottomLeft:
maskRect.X = 2;
maskRect.Y = height - markSize.Height - 2;
break;
case ContentAlignment.BottomCenter:
maskRect.X = (width - markSize.Width) / 2;
maskRect.Y = height - markSize.Height - 2;
break;
case ContentAlignment.BottomRight:
maskRect.X = width - markSize.Width - 2;
maskRect.Y = height - markSize.Height - 2;
break;
}
Bitmap bmp = new Bitmap(image);
using (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, opacity, 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);
using (Graphics g = Graphics.FromImage(bmp))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
using (Bitmap maskBmp = new Bitmap(markImage))
{
maskBmp.MakeTransparent();
g.DrawImage(
maskBmp,
maskRect,
0,
0,
markImage.Width,
markImage.Height,
GraphicsUnit.Pixel,
imageAttributes);
}
g.Flush();
}
}
return bmp;
}
}
使用方法: ImageWatermark.CreateWatermark(this.fileName,this.picPath,Size.Empty,0.5F,ContentAlignment.BottomRight);