using PaintDotNet.Base.SettingModel;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using PaintDotNet.Annotation.Enum;
using System.Collections.Generic;
using System.Drawing.Imaging;
namespace PaintDotNet.Annotation.Label
{
///
/// 标注->水印
///
public class DrawWaterMark : DrawObject
{
private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur"));
///
/// 标注样式信息model
///
public WatermarkModel waterMarkModel;
public DrawWaterMark(ISurfaceBox surfaceBox) : base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawWaterMark;
waterMarkModel = surfaceBox.GetWatermarkModel();
startPoint = new PointF(0, 0);
Initialize();
}
public DrawWaterMark(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) : base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawWaterMark;
this.ISurfaceBox = surfaceBox;
waterMarkModel = (WatermarkModel)parentStyleModel;
startPoint = points[0];
}
///
/// Clone this instance
///
public override DrawObject Clone()
{
DrawWaterMark waterMark = new DrawWaterMark(ISurfaceBox);
waterMark.objectType = DrawClass.Label;
waterMark.drawToolType = DrawToolType.DrawWaterMark;
waterMark.ISurfaceBox = ISurfaceBox;
waterMark.startPoint = this.startPoint;
FillDrawObjectFields(waterMark);
return waterMark;
}
public override DrawObject Clone(ISurfaceBox surfaceBox)
{
DrawWaterMark waterMark = new DrawWaterMark(surfaceBox);
waterMark.objectType = DrawClass.Label;
waterMark.drawToolType = DrawToolType.DrawWaterMark;
waterMark.ISurfaceBox = surfaceBox;
waterMark.startPoint = this.startPoint;
waterMark.waterMarkModel = this.waterMarkModel;
FillDrawObjectFields(waterMark);
return waterMark;
}
public override void Draw(Graphics g)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
SizeF windowSize = this.ISurfaceBox.GetDocumentSize();//窗体尺寸
int waterMarkType = this.waterMarkModel.watermarkType;//水印类型
string waterMarkStr = this.waterMarkModel.content;//水印内容
int waterMarkMargin = this.waterMarkModel.margin;//距边界值
int waterMarkSpread = this.waterMarkModel.spread;//平铺:1平铺;2非平铺
int waterMarkTransparency = this.waterMarkModel.transparency;//透明度
//水印位置
int waterMarkPosition = this.waterMarkModel.position;
if (waterMarkType == 1)//文字水印
{
int waterMarkDirection = this.waterMarkModel.direction;//方向:1水平;2垂直;3向前倾斜;4向后倾斜
FontStyle fontStyle = new FontStyle();
int waterMarkBold = this.waterMarkModel.bold;//粗体
int waterMarkItalic = this.waterMarkModel.italic;//斜体
if (waterMarkBold == 1 && waterMarkItalic != 1)
{
fontStyle = FontStyle.Bold;
}
if (waterMarkItalic == 1 && waterMarkBold != 1)
{
fontStyle = FontStyle.Italic;
}
if (waterMarkBold == 1 && waterMarkItalic == 1)
{
fontStyle = FontStyle.Bold | FontStyle.Italic;
}
Font textfont = new Font(this.waterMarkModel.typeface, this.waterMarkModel.fontSize, fontStyle);//配置文件的字号有问题
//Font textfont = new Font(this.waterMarkModel.typeface, 12, fontStyle);//强写的字号
Color oldColor = Color.FromArgb(this.waterMarkModel.color);
Color textColor = Color.FromArgb(waterMarkTransparency, oldColor.R, oldColor.G, oldColor.B);//重新赋值透明度
Brush textbrush = new SolidBrush(textColor);
Size fontSize = g.MeasureString(waterMarkStr, textfont).ToSize();
switch (waterMarkPosition)
{
case 1://左上
startPoint.X = waterMarkMargin;
startPoint.Y = waterMarkMargin;
break;
case 2://中上
startPoint.X = windowSize.Width / 2 - fontSize.Width / 2;
startPoint.Y = waterMarkMargin;
break;
case 3://右上
startPoint.X = windowSize.Width - fontSize.Width - waterMarkMargin;
startPoint.Y = waterMarkMargin;
break;
case 4://左中
startPoint.X = waterMarkMargin;
startPoint.Y = windowSize.Height / 2 - fontSize.Height / 2;
break;
case 5://中
startPoint.X = windowSize.Width / 2 - fontSize.Width / 2;
startPoint.Y = windowSize.Height / 2 - fontSize.Height / 2;
break;
case 6://右中
startPoint.X = windowSize.Width - fontSize.Width - waterMarkMargin;
startPoint.Y = windowSize.Height / 2 - fontSize.Height / 2;
break;
case 7://左下
startPoint.X = waterMarkMargin;
startPoint.Y = windowSize.Height - fontSize.Height - waterMarkMargin;
break;
case 8://中下
startPoint.X = windowSize.Width / 2 - fontSize.Width / 2;
startPoint.Y = windowSize.Height - fontSize.Height - waterMarkMargin;
break;
case 9://右下
startPoint.X = windowSize.Width - fontSize.Width - waterMarkMargin;
startPoint.Y = windowSize.Height - fontSize.Height - waterMarkMargin;
break;
}
if (waterMarkStr != null && waterMarkStr != "")
{
//画字符串的方式实现,旋转后会飞出画布
//Matrix matrix = g.Transform;
//Matrix mtxSave = g.Transform;
//int angle = 0;
//switch (waterMarkDirection)
//{
// case 2://垂直
// angle = 90;
// break;
// case 3://向前倾斜
// angle = -45;
// break;
// case 4://向后倾斜
// angle = 45;
// break;
//}
//matrix.RotateAt(angle, new PointF(float.Parse((startPoint.X + fontSize.Width / 2).ToString()), float.Parse((startPoint.Y + fontSize.Height / 2).ToString())));
//g.Transform = matrix;
//g.DrawString(waterMarkStr, textfont, textbrush, startPoint);
//g.Transform = mtxSave;
//matrix.Dispose();
//画字符串的方式平铺,同样会飞出画布
//for (int x = 0; x < windowSize.Width; x += (fontSize.Width + 15))
//{
// for (int y = 0; y < windowSize.Height; y += (fontSize.Height + 30))
// {
// g.DrawString(waterMarkStr, textfont, textbrush, x, y);
// }
//}
//文字转图片
Rectangle fontRectangle;
if (waterMarkSpread == 1)
{
fontRectangle = new Rectangle(0, 0, fontSize.Width + 15, fontSize.Height + 30);//平铺情况下给图片加间距
}
else
{
fontRectangle = new Rectangle(0, 0, fontSize.Width + 15, fontSize.Height + 30);
}
Bitmap btWord = new Bitmap(fontRectangle.Width, fontRectangle.Height);
Graphics newImg = Graphics.FromImage(btWord);
newImg.SmoothingMode = SmoothingMode.AntiAlias;
//newImg.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
newImg.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
newImg.FillRectangle(new SolidBrush(Color.FromArgb(0, Color.Green)), fontRectangle);
newImg.DrawString(waterMarkStr, textfont, textbrush, fontRectangle);
//g.DrawString(waterMarkStr, textfont, textbrush, startPoint.X - btWord.Width, startPoint.Y);
//g.DrawImage(btWord, startPoint);
//填充画布
Rectangle imgRec = new Rectangle(0, 0, btWord.Width, btWord.Height);
TextureBrush tb = new TextureBrush(btWord, imgRec);
if (waterMarkSpread == 1)
{
tb.WrapMode = WrapMode.Tile;//平铺填充模式
}
else
{
tb.TranslateTransform(startPoint.X, startPoint.Y);
tb.WrapMode = WrapMode.Clamp;//非平铺
}
switch (waterMarkDirection)
{
case 2://垂直
tb.RotateTransform(90);
break;
case 3://向前倾斜
tb.RotateTransform(-45);
break;
case 4://向后倾斜
tb.RotateTransform(45);
break;
}
g.FillRectangle(tb, new RectangleF(0, 0, windowSize.Width - 1, windowSize.Height - 1));
btWord.Dispose();
newImg.Dispose();
tb.Dispose();
}
textbrush.Dispose();
}
if (waterMarkType == 2)//图片水印
{
if (waterMarkStr != null && waterMarkStr != "")
{
try
{
//设置透明度
float imgTransparency = float.Parse(waterMarkTransparency.ToString()) / 255;
float[][] nArray ={ new float[] {1, 0, 0, 0, 0},
new float[] {0, 1, 0, 0, 0},
new float[] {0, 0, 1, 0, 0},
new float[] {0, 0, 0, imgTransparency, 0},
new float[] {0, 0, 0, 0, 1}};
ColorMatrix matrix = new ColorMatrix(nArray);
ImageAttributes attributes = new ImageAttributes();
attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
Image srcImage = Image.FromFile(waterMarkStr);
if (waterMarkSpread == 1)
{
Rectangle imgRec = new Rectangle(0, 0, srcImage.Width, srcImage.Height);//仅为实例化填充对象时可添加透明度所创建的矩形
TextureBrush tb = new TextureBrush(srcImage, imgRec, attributes);
tb.WrapMode = WrapMode.Tile;//平铺填充模式
g.FillRectangle(tb, new RectangleF(0, 0, windowSize.Width - 1, windowSize.Height - 1));
}
else
{
switch (waterMarkPosition)
{
case 1://左上
startPoint.X = waterMarkMargin;
startPoint.Y = waterMarkMargin;
break;
case 2://中上
startPoint.X = windowSize.Width / 2 - srcImage.Width / 2;
startPoint.Y = waterMarkMargin;
break;
case 3://右上
startPoint.X = windowSize.Width - srcImage.Width - waterMarkMargin;
startPoint.Y = waterMarkMargin;
break;
case 4://左中
startPoint.X = waterMarkMargin;
startPoint.Y = windowSize.Height / 2 - srcImage.Height / 2;
break;
case 5://中
startPoint.X = windowSize.Width / 2 - srcImage.Width / 2;
startPoint.Y = windowSize.Height / 2 - srcImage.Height / 2;
break;
case 6://右中
startPoint.X = windowSize.Width - srcImage.Width - waterMarkMargin;
startPoint.Y = windowSize.Height / 2 - srcImage.Height / 2;
break;
case 7://左下
startPoint.X = waterMarkMargin;
startPoint.Y = windowSize.Height - srcImage.Height - waterMarkMargin;
break;
case 8://中下
startPoint.X = windowSize.Width / 2 - srcImage.Width / 2;
startPoint.Y = windowSize.Height - srcImage.Height - waterMarkMargin;
break;
case 9://右下
startPoint.X = windowSize.Width - srcImage.Width - waterMarkMargin;
startPoint.Y = windowSize.Height - srcImage.Height - waterMarkMargin;
break;
}
g.DrawImage(srcImage, new Rectangle(Convert.ToInt32(startPoint.X), Convert.ToInt32(startPoint.Y), srcImage.Width, srcImage.Height), 0, 0, srcImage.Width, srcImage.Height, GraphicsUnit.Pixel, attributes);
attributes.Dispose();
srcImage.Dispose();
}
}
catch(Exception)
{
}
}
}
}
public override int HandleCount
{
get
{
return 0;
}
}
///
/// Get handle pointscroll by 1-based number
///
///
///
public override PointF GetHandle(int handleNumber)
{
return startPoint;
}
///
/// Hit test.
/// Return value: -1 - no hit
/// 0 - hit anywhere
/// > 1 - handle number
///
///
///
public override int HitTest(Point point)
{
if (Selected)
{
for (int i = 1; i <= HandleCount; i++)
{
if (GetHandleRectangle(i).Contains(point))
return i;
}
}
if (PointInObject(point))
return 0;
return -1;
}
protected override bool PointInObject(Point point)
{
return rectangle.Contains(point);
}
public override bool IntersectsWith(Rectangle rectangle)
{
return Rectangle.IntersectsWith(rectangle);
}
public override Cursor GetHandleCursor(int handleNumber)
{
return Cursors.Default;
}
public override void MoveHandleTo(Point point, int handleNumber)
{
}
public override void Move(int deltaX, int deltaY)
{
}
public override RectangleF GetBoundingBox()
{
return rectangle;
}
public override List GetPoints()
{
List points = new List();
points.Add(startPoint);
return points;
}
public override ParentStyleModel GetStyle()
{
return waterMarkModel;
}
}
}