123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- 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
- {
- /// <summary>
- /// 标注->水印
- /// </summary>
- public class DrawWaterMark : DrawObject
- {
- private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur"));
- /// <summary>
- /// 标注样式信息model
- /// </summary>
- 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<PointF> points, ParentStyleModel parentStyleModel, Object content) : base()
- {
- this.objectType = DrawClass.Label;
- this.drawToolType = DrawToolType.DrawWaterMark;
- this.ISurfaceBox = surfaceBox;
- waterMarkModel = (WatermarkModel)parentStyleModel;
- startPoint = points[0];
- }
- /// <summary>
- /// Clone this instance
- /// </summary>
- 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;
- }
- }
- /// <summary>
- /// Get handle pointscroll by 1-based number
- /// </summary>
- /// <param name="handleNumber"></param>
- /// <returns></returns>
- public override PointF GetHandle(int handleNumber)
- {
- return startPoint;
- }
- /// <summary>
- /// Hit test.
- /// Return value: -1 - no hit
- /// 0 - hit anywhere
- /// > 1 - handle number
- /// </summary>
- /// <param name="pointscroll"></param>
- /// <returns></returns>
- 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<PointF> GetPoints()
- {
- List<PointF> points = new List<PointF>();
- points.Add(startPoint);
- return points;
- }
- public override ParentStyleModel GetStyle()
- {
- return waterMarkModel;
- }
- }
- }
|