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