DrawWaterMark.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. using PaintDotNet.Base.SettingModel;
  2. using System;
  3. using System.Drawing;
  4. using System.Drawing.Drawing2D;
  5. using System.Windows.Forms;
  6. using PaintDotNet.Annotation.Enum;
  7. using System.Collections.Generic;
  8. using System.Drawing.Imaging;
  9. namespace PaintDotNet.Annotation.Label
  10. {
  11. /// <summary>
  12. /// 标注->水印
  13. /// </summary>
  14. public class DrawWaterMark : DrawObject
  15. {
  16. private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur"));
  17. /// <summary>
  18. /// 标注样式信息model
  19. /// </summary>
  20. public WatermarkModel waterMarkModel;
  21. public DrawWaterMark(ISurfaceBox surfaceBox) : base()
  22. {
  23. this.objectType = DrawClass.Label;
  24. this.drawToolType = DrawToolType.DrawWaterMark;
  25. waterMarkModel = surfaceBox.GetWatermarkModel();
  26. startPoint = new PointF(0, 0);
  27. Initialize();
  28. }
  29. public DrawWaterMark(ISurfaceBox surfaceBox, List<PointF> points, ParentStyleModel parentStyleModel, Object content) : base()
  30. {
  31. this.objectType = DrawClass.Label;
  32. this.drawToolType = DrawToolType.DrawWaterMark;
  33. this.ISurfaceBox = surfaceBox;
  34. waterMarkModel = (WatermarkModel)parentStyleModel;
  35. startPoint = points[0];
  36. }
  37. /// <summary>
  38. /// Clone this instance
  39. /// </summary>
  40. public override DrawObject Clone()
  41. {
  42. DrawWaterMark waterMark = new DrawWaterMark(ISurfaceBox);
  43. waterMark.objectType = DrawClass.Label;
  44. waterMark.drawToolType = DrawToolType.DrawWaterMark;
  45. waterMark.ISurfaceBox = ISurfaceBox;
  46. waterMark.startPoint = this.startPoint;
  47. FillDrawObjectFields(waterMark);
  48. return waterMark;
  49. }
  50. public override DrawObject Clone(ISurfaceBox surfaceBox)
  51. {
  52. DrawWaterMark waterMark = new DrawWaterMark(surfaceBox);
  53. waterMark.objectType = DrawClass.Label;
  54. waterMark.drawToolType = DrawToolType.DrawWaterMark;
  55. waterMark.ISurfaceBox = surfaceBox;
  56. waterMark.startPoint = this.startPoint;
  57. waterMark.waterMarkModel = this.waterMarkModel;
  58. FillDrawObjectFields(waterMark);
  59. return waterMark;
  60. }
  61. public override void Draw(Graphics g)
  62. {
  63. g.SmoothingMode = SmoothingMode.AntiAlias;
  64. SizeF windowSize = this.ISurfaceBox.GetDocumentSize();//窗体尺寸
  65. int waterMarkType = this.waterMarkModel.watermarkType;//水印类型
  66. string waterMarkStr = this.waterMarkModel.content;//水印内容
  67. int waterMarkMargin = this.waterMarkModel.margin;//距边界值
  68. int waterMarkSpread = this.waterMarkModel.spread;//平铺:1平铺;2非平铺
  69. int waterMarkTransparency = this.waterMarkModel.transparency;//透明度
  70. //水印位置
  71. int waterMarkPosition = this.waterMarkModel.position;
  72. if (waterMarkType == 1)//文字水印
  73. {
  74. int waterMarkDirection = this.waterMarkModel.direction;//方向:1水平;2垂直;3向前倾斜;4向后倾斜
  75. FontStyle fontStyle = new FontStyle();
  76. int waterMarkBold = this.waterMarkModel.bold;//粗体
  77. int waterMarkItalic = this.waterMarkModel.italic;//斜体
  78. if (waterMarkBold == 1 && waterMarkItalic != 1)
  79. {
  80. fontStyle = FontStyle.Bold;
  81. }
  82. if (waterMarkItalic == 1 && waterMarkBold != 1)
  83. {
  84. fontStyle = FontStyle.Italic;
  85. }
  86. if (waterMarkBold == 1 && waterMarkItalic == 1)
  87. {
  88. fontStyle = FontStyle.Bold | FontStyle.Italic;
  89. }
  90. Font textfont = new Font(this.waterMarkModel.typeface, this.waterMarkModel.fontSize, fontStyle);//配置文件的字号有问题
  91. //Font textfont = new Font(this.waterMarkModel.typeface, 12, fontStyle);//强写的字号
  92. Color oldColor = Color.FromArgb(this.waterMarkModel.color);
  93. Color textColor = Color.FromArgb(waterMarkTransparency, oldColor.R, oldColor.G, oldColor.B);//重新赋值透明度
  94. Brush textbrush = new SolidBrush(textColor);
  95. Size fontSize = g.MeasureString(waterMarkStr, textfont).ToSize();
  96. switch (waterMarkPosition)
  97. {
  98. case 1://左上
  99. startPoint.X = waterMarkMargin;
  100. startPoint.Y = waterMarkMargin;
  101. break;
  102. case 2://中上
  103. startPoint.X = windowSize.Width / 2 - fontSize.Width / 2;
  104. startPoint.Y = waterMarkMargin;
  105. break;
  106. case 3://右上
  107. startPoint.X = windowSize.Width - fontSize.Width - waterMarkMargin;
  108. startPoint.Y = waterMarkMargin;
  109. break;
  110. case 4://左中
  111. startPoint.X = waterMarkMargin;
  112. startPoint.Y = windowSize.Height / 2 - fontSize.Height / 2;
  113. break;
  114. case 5://中
  115. startPoint.X = windowSize.Width / 2 - fontSize.Width / 2;
  116. startPoint.Y = windowSize.Height / 2 - fontSize.Height / 2;
  117. break;
  118. case 6://右中
  119. startPoint.X = windowSize.Width - fontSize.Width - waterMarkMargin;
  120. startPoint.Y = windowSize.Height / 2 - fontSize.Height / 2;
  121. break;
  122. case 7://左下
  123. startPoint.X = waterMarkMargin;
  124. startPoint.Y = windowSize.Height - fontSize.Height - waterMarkMargin;
  125. break;
  126. case 8://中下
  127. startPoint.X = windowSize.Width / 2 - fontSize.Width / 2;
  128. startPoint.Y = windowSize.Height - fontSize.Height - waterMarkMargin;
  129. break;
  130. case 9://右下
  131. startPoint.X = windowSize.Width - fontSize.Width - waterMarkMargin;
  132. startPoint.Y = windowSize.Height - fontSize.Height - waterMarkMargin;
  133. break;
  134. }
  135. if (waterMarkStr != null && waterMarkStr != "")
  136. {
  137. //画字符串的方式实现,旋转后会飞出画布
  138. //Matrix matrix = g.Transform;
  139. //Matrix mtxSave = g.Transform;
  140. //int angle = 0;
  141. //switch (waterMarkDirection)
  142. //{
  143. // case 2://垂直
  144. // angle = 90;
  145. // break;
  146. // case 3://向前倾斜
  147. // angle = -45;
  148. // break;
  149. // case 4://向后倾斜
  150. // angle = 45;
  151. // break;
  152. //}
  153. //matrix.RotateAt(angle, new PointF(float.Parse((startPoint.X + fontSize.Width / 2).ToString()), float.Parse((startPoint.Y + fontSize.Height / 2).ToString())));
  154. //g.Transform = matrix;
  155. //g.DrawString(waterMarkStr, textfont, textbrush, startPoint);
  156. //g.Transform = mtxSave;
  157. //matrix.Dispose();
  158. //画字符串的方式平铺,同样会飞出画布
  159. //for (int x = 0; x < windowSize.Width; x += (fontSize.Width + 15))
  160. //{
  161. // for (int y = 0; y < windowSize.Height; y += (fontSize.Height + 30))
  162. // {
  163. // g.DrawString(waterMarkStr, textfont, textbrush, x, y);
  164. // }
  165. //}
  166. //文字转图片
  167. Rectangle fontRectangle;
  168. if (waterMarkSpread == 1)
  169. {
  170. fontRectangle = new Rectangle(0, 0, fontSize.Width + 15, fontSize.Height + 30);//平铺情况下给图片加间距
  171. }
  172. else
  173. {
  174. fontRectangle = new Rectangle(0, 0, fontSize.Width + 15, fontSize.Height + 30);
  175. }
  176. Bitmap btWord = new Bitmap(fontRectangle.Width, fontRectangle.Height);
  177. Graphics newImg = Graphics.FromImage(btWord);
  178. newImg.SmoothingMode = SmoothingMode.AntiAlias;
  179. //newImg.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
  180. newImg.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
  181. newImg.FillRectangle(new SolidBrush(Color.FromArgb(0, Color.Green)), fontRectangle);
  182. newImg.DrawString(waterMarkStr, textfont, textbrush, fontRectangle);
  183. //g.DrawString(waterMarkStr, textfont, textbrush, startPoint.X - btWord.Width, startPoint.Y);
  184. //g.DrawImage(btWord, startPoint);
  185. //填充画布
  186. Rectangle imgRec = new Rectangle(0, 0, btWord.Width, btWord.Height);
  187. TextureBrush tb = new TextureBrush(btWord, imgRec);
  188. if (waterMarkSpread == 1)
  189. {
  190. tb.WrapMode = WrapMode.Tile;//平铺填充模式
  191. }
  192. else
  193. {
  194. tb.TranslateTransform(startPoint.X, startPoint.Y);
  195. tb.WrapMode = WrapMode.Clamp;//非平铺
  196. }
  197. switch (waterMarkDirection)
  198. {
  199. case 2://垂直
  200. tb.RotateTransform(90);
  201. break;
  202. case 3://向前倾斜
  203. tb.RotateTransform(-45);
  204. break;
  205. case 4://向后倾斜
  206. tb.RotateTransform(45);
  207. break;
  208. }
  209. g.FillRectangle(tb, new RectangleF(0, 0, windowSize.Width - 1, windowSize.Height - 1));
  210. btWord.Dispose();
  211. newImg.Dispose();
  212. tb.Dispose();
  213. }
  214. textbrush.Dispose();
  215. }
  216. if (waterMarkType == 2)//图片水印
  217. {
  218. if (waterMarkStr != null && waterMarkStr != "")
  219. {
  220. try
  221. {
  222. //设置透明度
  223. float imgTransparency = float.Parse(waterMarkTransparency.ToString()) / 255;
  224. float[][] nArray ={ new float[] {1, 0, 0, 0, 0},
  225. new float[] {0, 1, 0, 0, 0},
  226. new float[] {0, 0, 1, 0, 0},
  227. new float[] {0, 0, 0, imgTransparency, 0},
  228. new float[] {0, 0, 0, 0, 1}};
  229. ColorMatrix matrix = new ColorMatrix(nArray);
  230. ImageAttributes attributes = new ImageAttributes();
  231. attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
  232. Image srcImage = Image.FromFile(waterMarkStr);
  233. if (waterMarkSpread == 1)
  234. {
  235. Rectangle imgRec = new Rectangle(0, 0, srcImage.Width, srcImage.Height);//仅为实例化填充对象时可添加透明度所创建的矩形
  236. TextureBrush tb = new TextureBrush(srcImage, imgRec, attributes);
  237. tb.WrapMode = WrapMode.Tile;//平铺填充模式
  238. g.FillRectangle(tb, new RectangleF(0, 0, windowSize.Width - 1, windowSize.Height - 1));
  239. }
  240. else
  241. {
  242. switch (waterMarkPosition)
  243. {
  244. case 1://左上
  245. startPoint.X = waterMarkMargin;
  246. startPoint.Y = waterMarkMargin;
  247. break;
  248. case 2://中上
  249. startPoint.X = windowSize.Width / 2 - srcImage.Width / 2;
  250. startPoint.Y = waterMarkMargin;
  251. break;
  252. case 3://右上
  253. startPoint.X = windowSize.Width - srcImage.Width - waterMarkMargin;
  254. startPoint.Y = waterMarkMargin;
  255. break;
  256. case 4://左中
  257. startPoint.X = waterMarkMargin;
  258. startPoint.Y = windowSize.Height / 2 - srcImage.Height / 2;
  259. break;
  260. case 5://中
  261. startPoint.X = windowSize.Width / 2 - srcImage.Width / 2;
  262. startPoint.Y = windowSize.Height / 2 - srcImage.Height / 2;
  263. break;
  264. case 6://右中
  265. startPoint.X = windowSize.Width - srcImage.Width - waterMarkMargin;
  266. startPoint.Y = windowSize.Height / 2 - srcImage.Height / 2;
  267. break;
  268. case 7://左下
  269. startPoint.X = waterMarkMargin;
  270. startPoint.Y = windowSize.Height - srcImage.Height - waterMarkMargin;
  271. break;
  272. case 8://中下
  273. startPoint.X = windowSize.Width / 2 - srcImage.Width / 2;
  274. startPoint.Y = windowSize.Height - srcImage.Height - waterMarkMargin;
  275. break;
  276. case 9://右下
  277. startPoint.X = windowSize.Width - srcImage.Width - waterMarkMargin;
  278. startPoint.Y = windowSize.Height - srcImage.Height - waterMarkMargin;
  279. break;
  280. }
  281. 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);
  282. attributes.Dispose();
  283. srcImage.Dispose();
  284. }
  285. }
  286. catch(Exception)
  287. {
  288. }
  289. }
  290. }
  291. }
  292. public override int HandleCount
  293. {
  294. get
  295. {
  296. return 0;
  297. }
  298. }
  299. /// <summary>
  300. /// Get handle pointscroll by 1-based number
  301. /// </summary>
  302. /// <param name="handleNumber"></param>
  303. /// <returns></returns>
  304. public override PointF GetHandle(int handleNumber)
  305. {
  306. return startPoint;
  307. }
  308. /// <summary>
  309. /// Hit test.
  310. /// Return value: -1 - no hit
  311. /// 0 - hit anywhere
  312. /// > 1 - handle number
  313. /// </summary>
  314. /// <param name="pointscroll"></param>
  315. /// <returns></returns>
  316. public override int HitTest(Point point)
  317. {
  318. if (Selected)
  319. {
  320. for (int i = 1; i <= HandleCount; i++)
  321. {
  322. if (GetHandleRectangle(i).Contains(point))
  323. return i;
  324. }
  325. }
  326. if (PointInObject(point))
  327. return 0;
  328. return -1;
  329. }
  330. protected override bool PointInObject(Point point)
  331. {
  332. return rectangle.Contains(point);
  333. }
  334. public override bool IntersectsWith(Rectangle rectangle)
  335. {
  336. return Rectangle.IntersectsWith(rectangle);
  337. }
  338. public override Cursor GetHandleCursor(int handleNumber)
  339. {
  340. return Cursors.Default;
  341. }
  342. public override void MoveHandleTo(Point point, int handleNumber)
  343. {
  344. }
  345. public override void Move(int deltaX, int deltaY)
  346. {
  347. }
  348. public override RectangleF GetBoundingBox()
  349. {
  350. return rectangle;
  351. }
  352. public override List<PointF> GetPoints()
  353. {
  354. List<PointF> points = new List<PointF>();
  355. points.Add(startPoint);
  356. return points;
  357. }
  358. public override ParentStyleModel GetStyle()
  359. {
  360. return waterMarkModel;
  361. }
  362. }
  363. }