You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1679 lines
63 KiB

1 month ago
  1. using AForge.Imaging;
  2. using Customize.Controls;
  3. using OpenCvSharp;
  4. using ShenTun.ImageCollection.Common;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Data;
  9. using System.Diagnostics;
  10. using System.Drawing;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Security.Cryptography;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using System.Windows.Forms;
  17. using System.Windows.Forms.Design;
  18. namespace ShenTun.ImageCollection.AForgeCamera
  19. {
  20. public partial class ImageEdit : UserControl
  21. {
  22. private Bitmap Bi; //定义位图对像
  23. private string filePath;
  24. private bool boolShow1 = false;//把截图的图片付给picturebox的时候用到
  25. private Rectangle rect = Rectangle.Empty;
  26. private Pen p;
  27. private bool clipMode = false; // 是否开启裁切
  28. private bool textMode = false; // 是否开启标注
  29. public bool isSelected = false; // 是否点击图像
  30. public bool isDrawing = false; // 是否点击图像
  31. public System.Drawing.Point mouseDownPoint; // 记录鼠标点击坐标
  32. private ExtendedTextPanel currentInputPanel = null;
  33. private System.Drawing.Point mouseOff;//鼠标移动位置变量
  34. private bool leftFlag;//标签是否为左键
  35. private string trackBarType = "";
  36. private SelectImageInfo selectImage = null;
  37. private ApiService apiService = new ApiService();
  38. private bool isShowList = false;
  39. private int widthbox;
  40. private int heightbox;
  41. //定义一个枚举,表示拖动方向
  42. public enum MouseDirection
  43. {
  44. Herizontal,//水平方向拖动,只改变窗体的宽度
  45. Vertical,//垂直方向拖动,只改变窗体的高度
  46. Declining,//倾斜方向,同时改变窗体的宽度和高度
  47. None//不做标志,即不拖动窗体改变大小
  48. }
  49. #region 缩放、裁剪图像用到的变量
  50. /// <summary>
  51. ///
  52. /// </summary>
  53. private int x1; //鼠标按下时横坐标
  54. private int y1; //鼠标按下时纵坐标
  55. private int width; //所打开的图像的宽
  56. private int heigth; //所打开的图像的高
  57. private bool HeadImageBool = false; // 此布尔变量用来判断pictureBox1控件是否有图片
  58. #endregion
  59. #region 画矩形使用到的变量
  60. private System.Drawing.Point p1; //定义鼠标按下时的坐标点
  61. private System.Drawing.Point p2; //定义移动鼠标时的坐标点
  62. private System.Drawing.Point p3; //定义松开鼠标时的坐标点
  63. #endregion
  64. public ImageEdit()
  65. {
  66. InitializeComponent();
  67. }
  68. public void LoadImageAndInit(MemoryStream mstr, string _filePath)
  69. {
  70. Init(mstr, _filePath);
  71. isShowList = false;
  72. }
  73. public void LoadImageAndInit(MemoryStream mstr, SelectImageInfo imageInfo)
  74. {
  75. selectImage = imageInfo;
  76. isShowList = true;
  77. Init(mstr, imageInfo.Image.localPathName);
  78. }
  79. public void Init(MemoryStream mstr,string _filePath)
  80. {
  81. if (Bi != null)
  82. {
  83. Bi.Dispose();
  84. }
  85. Bi = new Bitmap(mstr);
  86. filePath = _filePath;
  87. widthbox = this.pictBoxSour.Width;
  88. heightbox = this.pictBoxSour.Height;
  89. ImageCut IC = new ImageCut(0, 0, widthbox, heightbox);
  90. this.pictBoxSour.Image = IC.KiCut((Bitmap)(this.GetSelectImage(widthbox, heightbox)));
  91. this.btnList.Visible = isShowList;
  92. }
  93. /// <summary>
  94. /// 额 ,这个在打开图片里用到了
  95. /// 获取指定宽度和高度的图像即使图片和pictureBox1控件一样宽和高,返回值为图片Image
  96. /// </summary>
  97. /// <param name="Width表示宽"></param>
  98. /// <param name="Height表示高"></param>
  99. /// <returns></returns>
  100. private System.Drawing.Image GetSelectImage(int Width, int Height)
  101. {
  102. //Image initImage = this.pictureBox1.Image;
  103. System.Drawing.Image initImage = Bi;
  104. //原图宽高均小于模版,不作处理,直接保存
  105. if (initImage.Width <= Width && initImage.Height <= Height)
  106. {
  107. //initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
  108. return initImage;
  109. }
  110. else
  111. {
  112. //原始图片的宽、高
  113. int initWidth = initImage.Width;
  114. int initHeight = initImage.Height;
  115. //非正方型先裁剪为正方型
  116. if (initWidth != initHeight)
  117. {
  118. //截图对象
  119. System.Drawing.Image pickedImage = null;
  120. System.Drawing.Graphics pickedG = null;
  121. //宽大于高的横图
  122. if (initWidth > initHeight)
  123. {
  124. //对象实例化
  125. pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
  126. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  127. //设置质量
  128. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  129. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  130. //定位
  131. Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
  132. Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
  133. //画图
  134. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  135. //重置宽
  136. initWidth = initHeight;
  137. }
  138. //高大于宽的竖图
  139. else
  140. {
  141. //对象实例化
  142. pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
  143. pickedG = System.Drawing.Graphics.FromImage(pickedImage);
  144. //设置质量
  145. pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  146. pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  147. //定位
  148. Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
  149. Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
  150. //画图
  151. pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
  152. //重置高
  153. initHeight = initWidth;
  154. }
  155. initImage = (System.Drawing.Image)pickedImage.Clone();
  156. // //释放截图资源
  157. pickedG.Dispose();
  158. pickedImage.Dispose();
  159. }
  160. return initImage;
  161. }
  162. }
  163. #region pictBoxSour控件裁剪事件
  164. /// <summary>
  165. /// 鼠标进入控件picturebox,光标十字 左侧要剪切的大图
  166. /// </summary>
  167. /// <param name="sender"></param>
  168. /// <param name="e"></param>
  169. private void pictBoxSour_MouseEnter(object sender, EventArgs e)
  170. {
  171. this.Cursor = Cursors.Cross;//十字线光标
  172. }
  173. /// <summary>
  174. /// 鼠标离开picturebox时,光标默认 左侧要剪切的大图
  175. /// </summary>
  176. /// <param name="sender"></param>
  177. /// <param name="e"></param>
  178. private void pictBoxSour_MouseLeave(object sender, EventArgs e)
  179. {
  180. this.Cursor = Cursors.Default;//默认光标
  181. }
  182. #region 鼠标按下时发生的事件
  183. /// <summary>
  184. /// 鼠标按下事件 左侧要剪切的大图
  185. /// </summary>
  186. /// <param name="sender"></param>
  187. /// <param name="e"></param>
  188. private void pictBoxSour_MouseDown(object sender, MouseEventArgs e)
  189. {
  190. this.Cursor = Cursors.Cross;//十字光标
  191. this.p1 = new System.Drawing.Point(e.X, e.Y);
  192. x1 = e.X;
  193. y1 = e.Y;
  194. if (this.pictBoxSour.Image != null)
  195. {
  196. HeadImageBool = true;
  197. }
  198. else
  199. {
  200. HeadImageBool = false;
  201. }
  202. }
  203. #endregion
  204. #region 移动鼠标发生的事件
  205. /// <summary>
  206. /// 鼠标移动事件 左侧要剪切的大图
  207. /// </summary>
  208. /// <param name="sender"></param>
  209. /// <param name="e"></param>
  210. private void pictBoxSour_MouseMove(object sender, MouseEventArgs e)
  211. {
  212. //十字光标并且鼠标有按下
  213. if (this.Cursor == Cursors.Cross && e.Button != MouseButtons.None)
  214. {
  215. this.p2 = new System.Drawing.Point(e.X, e.Y);
  216. if ((p2.X - p1.X) > 0 && (p2.Y - p1.Y) > 0) //当鼠标从左上角向开始移动时P3坐标
  217. {
  218. this.p3 = new System.Drawing.Point(p1.X, p1.Y);
  219. }
  220. if ((p2.X - p1.X) < 0 && (p2.Y - p1.Y) > 0) //当鼠标从右上角向左下方向开始移动时P3坐标
  221. {
  222. this.p3 = new System.Drawing.Point(p2.X, p1.Y);
  223. }
  224. if ((p2.X - p1.X) > 0 && (p2.Y - p1.Y) < 0) //当鼠标从左下角向上开始移动时P3坐标
  225. {
  226. this.p3 = new System.Drawing.Point(p1.X, p2.Y);
  227. }
  228. if ((p2.X - p1.X) < 0 && (p2.Y - p1.Y) < 0) //当鼠标从右下角向左方向上开始移动时P3坐标
  229. {
  230. this.p3 = new System.Drawing.Point(p2.X, p2.Y);
  231. }
  232. this.pictBoxSour.Invalidate(); //使控件的整个图面无效,并导致重绘控件
  233. }
  234. }
  235. #endregion
  236. #region 释放鼠标 松开鼠标发生的事件,实例化ImageCut类对像
  237. ImageCut IC1; //定义所画矩形的图像对像
  238. /// <summary>
  239. /// 鼠标放开事件 左侧要剪切的大图
  240. /// </summary>
  241. /// <param name="sender"></param>
  242. /// <param name="e"></param>
  243. private void pictBoxSour_MouseUp(object sender, MouseEventArgs e)
  244. {
  245. if (HeadImageBool)
  246. {
  247. width = this.pictBoxSour.Image.Width;
  248. heigth = this.pictBoxSour.Image.Height;
  249. if ((e.X - x1) > 0 && (e.Y - y1) > 0) //当鼠标从左上角向右下方向开始移动时发生
  250. {
  251. IC1 = new ImageCut(x1, y1, Math.Abs(e.X - x1), Math.Abs(e.Y - y1)); //实例化ImageCut1类
  252. }
  253. if ((e.X - x1) < 0 && (e.Y - y1) > 0) //当鼠标从右上角向左下方向开始移动时发生
  254. {
  255. IC1 = new ImageCut(e.X, y1, Math.Abs(e.X - x1), Math.Abs(e.Y - y1)); //实例化ImageCut1类
  256. }
  257. if ((e.X - x1) > 0 && (e.Y - y1) < 0) //当鼠标从左下角向右上方向开始移动时发生
  258. {
  259. IC1 = new ImageCut(x1, e.Y, Math.Abs(e.X - x1), Math.Abs(e.Y - y1)); //实例化ImageCut1类
  260. }
  261. if ((e.X - x1) < 0 && (e.Y - y1) < 0) //当鼠标从右下角向左上方向开始移动时发生
  262. {
  263. IC1 = new ImageCut(e.X, e.Y, Math.Abs(e.X - x1), Math.Abs(e.Y - y1)); //实例化ImageCut1类
  264. }
  265. //判断是否裁剪了
  266. if (IC1 != null)
  267. {
  268. this.pictureBoxShow.Image = IC1.KiCut((Bitmap)(this.pictBoxSour.Image));
  269. }
  270. this.Cursor = Cursors.Cross;
  271. }
  272. else
  273. {
  274. this.Cursor = Cursors.Default;
  275. }
  276. //以下代码是消除原图片框内的黑色边框
  277. //原理,将需要画的框设定为长宽均为0
  278. p1 = new System.Drawing.Point(0, 0);
  279. p2 = new System.Drawing.Point(0, 0);
  280. p3 = new System.Drawing.Point(0, 0);
  281. //强行触发原图画框的Paint事件。同时,请注意原图框的控件名称是pictBoxSour不是pictureBox1
  282. this.pictBoxSour.Refresh();
  283. }
  284. #endregion
  285. #region 重新绘制pictBoxSour控件,即移动鼠标画矩形
  286. /// <summary>
  287. /// paint事件 左侧要剪切的大图
  288. /// </summary>
  289. /// <param name="sender"></param>
  290. /// <param name="e"></param>
  291. private void pictBoxSour_Paint(object sender, PaintEventArgs e)
  292. {
  293. if (HeadImageBool)
  294. {
  295. p = new Pen(Color.Black, 1);//画笔
  296. p.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;//.DashStyle.Dash;
  297. rect = new Rectangle(p3, new System.Drawing.Size(System.Math.Abs(p2.X - p1.X), System.Math.Abs(p2.Y - p1.Y)));
  298. e.Graphics.DrawRectangle(p, rect);
  299. }
  300. }
  301. #endregion
  302. #endregion
  303. private void pictureBox_MouseDown(object sender, MouseEventArgs e)
  304. {
  305. if (!clipMode)
  306. {
  307. //if (currentImageBox != null)
  308. //{
  309. // currentImageBox.Focus();
  310. //}
  311. if (e.Button == MouseButtons.Left)
  312. {
  313. if (textMode)
  314. {
  315. mouseDownPoint.X = e.Location.X;
  316. mouseDownPoint.Y = e.Location.Y;
  317. Cursor.Current = Cursors.Cross;
  318. isDrawing = true;
  319. this.addTextInput(e);
  320. }
  321. else
  322. {
  323. mouseDownPoint.X = Cursor.Position.X;
  324. mouseDownPoint.Y = Cursor.Position.Y;
  325. Cursor.Current = Cursors.SizeAll;
  326. isSelected = true;
  327. }
  328. }
  329. }
  330. }
  331. private void pictureBox_MouseMove(object sender, MouseEventArgs e)
  332. {
  333. if (!clipMode)
  334. {
  335. if (isDrawing)
  336. {
  337. this.resizeTextInput(e);
  338. mouseDownPoint.X = e.Location.X;
  339. mouseDownPoint.Y = e.Location.Y;
  340. }
  341. else if (isSelected)
  342. {
  343. //currentPictureBox.Left = currentPictureBox.Left + (Cursor.Position.X - mouseDownPoint.X);
  344. //currentPictureBox.Top = currentPictureBox.Top + (Cursor.Position.Y - mouseDownPoint.Y);
  345. mouseDownPoint.X = Cursor.Position.X;
  346. mouseDownPoint.Y = Cursor.Position.Y;
  347. }
  348. }
  349. }
  350. private void pictureBox_MouseUp(object sender, MouseEventArgs e)
  351. {
  352. if (textMode)
  353. {
  354. this.importTextInput();
  355. }
  356. isSelected = false;
  357. isDrawing = false;
  358. }
  359. private void addTextInput(MouseEventArgs e)
  360. {
  361. Debug.WriteLine("addTextInput");
  362. ExtendedTextPanel inputPanel = new ExtendedTextPanel();
  363. currentInputPanel = inputPanel;
  364. currentInputPanel.Opacity = 0;
  365. currentInputPanel.Mode = "text";
  366. pictureBoxShow.Controls.Add(inputPanel);
  367. currentInputPanel.Size = new System.Drawing.Size(0, 0);
  368. currentInputPanel.Location = new System.Drawing.Point(e.Location.X, e.Location.Y);
  369. }
  370. private void resizeTextInput(MouseEventArgs e)
  371. {
  372. if (currentInputPanel != null)
  373. {
  374. int dtW = e.Location.X - mouseDownPoint.X;
  375. int dtH = e.Location.Y - mouseDownPoint.Y;
  376. currentInputPanel.Width += dtW;
  377. currentInputPanel.Height += dtH;
  378. }
  379. }
  380. private void importTextInput()
  381. {
  382. if (currentInputPanel == null)
  383. {
  384. return;
  385. }
  386. // 太小的不创建
  387. if (currentInputPanel.Width < 10 || currentInputPanel.Height < 10)
  388. {
  389. pictureBoxShow.Controls.Remove(currentInputPanel);
  390. currentInputPanel = null;
  391. return;
  392. }
  393. Debug.WriteLine("importTextInput");
  394. currentInputPanel.showTransTextBox();
  395. //currentInputPanel.LostFocus += new EventHandler(txt_LostFocus); //失去焦点后发生事件
  396. //textBox.GotFocus += new EventHandler(txt_GotFocus); //获取焦点前发生事件
  397. //textBox.MouseClick += new MouseEventHandler(txt_MouseClick); // 鼠标点击事件
  398. }
  399. private void writeToImage()
  400. {
  401. if (currentInputPanel == null) return;
  402. if (currentInputPanel.TransTextBox.Text.Length == 0) return;
  403. Graphics g = Graphics.FromImage(pictureBoxShow.Image);//定义一个GDI+
  404. SolidBrush drawBrush = new SolidBrush(currentInputPanel.TransTextBox.ForeColor);//定义一个画笔,在这里我读取了textBox1的字体颜色
  405. Font drawFont = new Font(currentInputPanel.TransTextBox.Font.FontFamily, currentInputPanel.TransTextBox.Font.Size);//定义一个font,设置字的样式,大小,都是读取textBox1的值<br>         //往图片上写字。这里需要注意的是Point,因为在图片加载的时候你可能采取了一定的压缩或者放大,所以要乘以压缩比例scaling
  406. g.DrawString(currentInputPanel.TransTextBox.Text, drawFont, drawBrush, new System.Drawing.Point(currentInputPanel.Location.X, currentInputPanel.Location.Y));
  407. pictureBoxShow.Controls.Remove(currentInputPanel);//然后移除添加的那个textBox1
  408. }
  409. private void RemoveTextHandle()
  410. {
  411. this.pictureBoxShow.MouseDown -= this.pictureBox_MouseDown;
  412. this.pictureBoxShow.MouseMove -= this.pictureBox_MouseMove;
  413. this.pictureBoxShow.MouseUp -= this.pictureBox_MouseUp;
  414. }
  415. private void AddTextHandle()
  416. {
  417. this.pictureBoxShow.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown);
  418. this.pictureBoxShow.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);
  419. this.pictureBoxShow.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseUp);
  420. }
  421. private void RemoveCutHandle()
  422. {
  423. this.pictBoxSour.MouseDown -= this.pictBoxSour_MouseDown;
  424. this.pictBoxSour.MouseEnter -= this.pictBoxSour_MouseEnter;
  425. this.pictBoxSour.MouseLeave -= this.pictBoxSour_MouseLeave;
  426. this.pictBoxSour.MouseMove -= this.pictBoxSour_MouseMove;
  427. this.pictBoxSour.MouseUp -= this.pictBoxSour_MouseUp;
  428. }
  429. private void AddCutHandle()
  430. {
  431. this.pictBoxSour.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictBoxSour_MouseDown);
  432. this.pictBoxSour.MouseEnter += new System.EventHandler(this.pictBoxSour_MouseEnter);
  433. this.pictBoxSour.MouseLeave += new System.EventHandler(this.pictBoxSour_MouseLeave);
  434. this.pictBoxSour.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictBoxSour_MouseMove);
  435. this.pictBoxSour.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictBoxSour_MouseUp);
  436. }
  437. private void btnCancel_Click(object sender, EventArgs e)
  438. {
  439. if (pictBoxSour.Image != null)
  440. {
  441. pictBoxSour.Image.Dispose();
  442. }
  443. if (this.Parent is Form)
  444. {
  445. if (((Form)this.Parent).Name.Equals("FrmImage"))
  446. {
  447. ((Form)this.Parent).DialogResult = DialogResult.Cancel;
  448. }
  449. }
  450. if (this.Parent is SplitterPanel)
  451. {
  452. if (this.Parent.Parent.Parent is Form)
  453. {
  454. if (((Form)this.Parent.Parent.Parent).Name.Equals("FrmImageList"))
  455. {
  456. ((Form)this.Parent.Parent.Parent).DialogResult = DialogResult.Cancel;
  457. }
  458. }
  459. }
  460. }
  461. private void btnList_Click(object sender, EventArgs e)
  462. {
  463. if (this.Parent is SplitterPanel)
  464. {
  465. if (this.Parent.Parent is SplitContainer)
  466. {
  467. ((SplitContainer)this.Parent.Parent).Panel1Collapsed = !((SplitContainer)this.Parent.Parent).Panel1Collapsed;
  468. if (((SplitContainer)this.Parent.Parent).Panel1Collapsed)
  469. {
  470. ImageCut IC = new ImageCut(0, 0, widthbox, heightbox);
  471. this.pictBoxSour.Image = IC.KiCut((Bitmap)(this.GetSelectImage(widthbox, heightbox)));
  472. }
  473. }
  474. }
  475. }
  476. private async void btnSave_Click(object sender, EventArgs e)
  477. {
  478. try {
  479. if (clipMode)
  480. {
  481. this.btnCut.BackColor = Color.Transparent;
  482. this.btnCut.ForeColor = Color.Black;
  483. RemoveCutHandle();
  484. clipMode = false;
  485. }
  486. if (textMode)
  487. {
  488. writeToImage();
  489. textMode = false;
  490. this.btnText.BackColor = Color.Transparent;
  491. this.btnText.ForeColor = Color.Black;
  492. RemoveTextHandle();
  493. textMode = false;
  494. }
  495. if (this.Parent is Form)
  496. {
  497. if (pictureBoxShow.Image == null)
  498. { ImageData.Image = (Bitmap)pictBoxSour.Image.Clone(); }
  499. else { ImageData.Image = (Bitmap)pictureBoxShow.Image.Clone(); }
  500. if (pictureBoxShow.Image != null)
  501. {
  502. pictureBoxShow.Image.Dispose();
  503. }
  504. if (((Form)this.Parent).Name.Equals("FrmImage"))
  505. {
  506. ((Form)this.Parent).DialogResult = DialogResult.OK;
  507. }
  508. }
  509. if (this.Parent is SplitterPanel)
  510. {
  511. if (this.Parent.Parent.Parent is Form)
  512. {
  513. if (((Form)this.Parent.Parent.Parent).Name.Equals("FrmImageList"))
  514. {
  515. this.btnSave.Enabled = false;
  516. if (File.Exists(selectImage.Image.localPathName))
  517. {
  518. File.Delete(selectImage.Image.localPathName);
  519. }
  520. Bitmap oldImg = null;
  521. if (pictureBoxShow.Image == null)
  522. { oldImg = (Bitmap)pictBoxSour.Image.Clone(); }
  523. else { oldImg = (Bitmap)pictureBoxShow.Image.Clone(); }
  524. Bitmap img = new Bitmap(oldImg);
  525. Graphics draw = Graphics.FromImage(img);
  526. draw.DrawImage(oldImg, 0, 0, oldImg.Width, oldImg.Height);
  527. oldImg.Dispose();
  528. int iPos = selectImage.Image.localPathName.LastIndexOf("\\");
  529. string localFilename = selectImage.Image.localPathName.Substring(iPos + 1);
  530. using (MemoryStream stream = new MemoryStream())
  531. {
  532. img.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
  533. await apiService.UploadImage(stream, selectImage);
  534. }
  535. img.Save(selectImage.Image.localPathName, System.Drawing.Imaging.ImageFormat.Jpeg);
  536. img.Dispose();
  537. this.btnSave.Enabled = true;
  538. }
  539. }
  540. }
  541. }
  542. catch (Exception exp)
  543. {
  544. MessageBox.Show(exp.ToString());
  545. return;
  546. }
  547. }
  548. private void btnCut_Click(object sender, EventArgs e)
  549. {
  550. clipMode = !clipMode;
  551. if (textMode)
  552. {
  553. writeToImage();
  554. textMode = false;
  555. this.btnText.BackColor = Color.Transparent;
  556. this.btnText.ForeColor = Color.Black;
  557. RemoveTextHandle();
  558. }
  559. if (clipMode)
  560. {
  561. this.btnCut.BackColor = Color.Blue;
  562. this.btnCut.ForeColor = Color.White;
  563. AddCutHandle();
  564. }
  565. else
  566. {
  567. this.btnCut.BackColor = Color.Transparent;
  568. this.btnCut.ForeColor = Color.Black;
  569. RemoveCutHandle();
  570. }
  571. }
  572. private void btnText_Click(object sender, EventArgs e)
  573. {
  574. textMode = !textMode;
  575. if (clipMode)
  576. {
  577. this.btnCut.BackColor = Color.Transparent;
  578. this.btnCut.ForeColor = Color.Black;
  579. RemoveCutHandle();
  580. }
  581. if (textMode)
  582. {
  583. this.btnText.BackColor = Color.Blue;
  584. this.btnText.ForeColor = Color.White;
  585. AddTextHandle();
  586. }
  587. else
  588. {
  589. this.btnText.BackColor = Color.Transparent;
  590. this.btnText.ForeColor = Color.Black;
  591. RemoveTextHandle();
  592. writeToImage();
  593. }
  594. }
  595. private void ImageModifyBefore()
  596. {
  597. var oldImg = (Bitmap)pictBoxSour.Image.Clone();
  598. Bitmap img = new Bitmap(oldImg);
  599. Graphics draw = Graphics.FromImage(img);
  600. draw.DrawImage(oldImg, 0, 0, oldImg.Width, oldImg.Height);
  601. oldImg.Dispose();
  602. img.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);
  603. img.Dispose();
  604. }
  605. private void ImageModifyAfter()
  606. {
  607. using (FileStream fileStream = File.Open(filePath, FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite))
  608. {
  609. // 创建一个字节数组来保存FileStream的内容
  610. byte[] fileBytes = new byte[fileStream.Length];
  611. fileStream.Read(fileBytes, 0, fileBytes.Length);
  612. // 使用字节数组创建MemoryStream
  613. using (MemoryStream memoryStream = new MemoryStream(fileBytes))
  614. {
  615. Bi.Dispose();
  616. Bi = new Bitmap(memoryStream);
  617. this.pictureBoxShow.Image = Bi;
  618. }
  619. }
  620. }
  621. private void btnToBig_Click(object sender, EventArgs e)
  622. {
  623. try
  624. {
  625. ImageModifyBefore();
  626. Mat src = new Mat(filePath, ImreadModes.Color);
  627. Mat temImage = new Mat();
  628. Mat dstImage2 = new Mat();
  629. temImage = src;
  630. Cv2.Resize(temImage, dstImage2, new OpenCvSharp.Size(temImage.Cols * 2, temImage.Rows * 2), 0, 0, InterpolationFlags.Linear);
  631. dstImage2.SaveImage(filePath);
  632. ImageModifyAfter();
  633. }
  634. catch (Exception exp)
  635. {
  636. MessageBox.Show(exp.ToString());
  637. return;
  638. }
  639. }
  640. private void btnToSmall_Click(object sender, EventArgs e)
  641. {
  642. try
  643. {
  644. ImageModifyBefore();
  645. Mat src = new Mat(filePath, ImreadModes.Color);
  646. Mat temImage = new Mat();
  647. Mat dstImage1 = new Mat();
  648. temImage = src;
  649. Cv2.Resize(temImage, dstImage1, new OpenCvSharp.Size(temImage.Cols / 2, temImage.Rows / 2), 0, 0, InterpolationFlags.Linear);
  650. dstImage1.SaveImage(filePath);
  651. ImageModifyAfter();
  652. }
  653. catch (Exception exp)
  654. {
  655. MessageBox.Show(exp.ToString());
  656. return;
  657. }
  658. }
  659. private void btnmirror_Click(object sender, EventArgs e)
  660. {
  661. try
  662. {
  663. ImageModifyBefore();
  664. Mat image = new Mat(filePath, ImreadModes.Color);
  665. Mat result = new Mat();
  666. Cv2.Flip(image, result, FlipMode.Y);
  667. result.SaveImage(filePath);
  668. ImageModifyAfter();
  669. }
  670. catch (Exception exp)
  671. {
  672. MessageBox.Show(exp.ToString());
  673. return;
  674. }
  675. }
  676. private void btnvertical_Click(object sender, EventArgs e)
  677. {
  678. try
  679. {
  680. ImageModifyBefore();
  681. Mat image = new Mat(filePath, ImreadModes.Color);
  682. Mat result = new Mat();
  683. Cv2.Flip(image, result, FlipMode.X);
  684. result.SaveImage(filePath);
  685. ImageModifyAfter();
  686. }
  687. catch (Exception exp)
  688. {
  689. MessageBox.Show(exp.ToString());
  690. return;
  691. }
  692. }
  693. private void pDialog_MouseDown(object sender, MouseEventArgs e)
  694. {
  695. if (e.Button == MouseButtons.Left)//判断鼠标左键是否被按下
  696. {
  697. mouseOff = new System.Drawing.Point(-e.X, -e.Y);//得到变量的值
  698. leftFlag = true;//标记鼠标左键的状态
  699. }
  700. }
  701. private void pDialog_MouseUp(object sender, MouseEventArgs e)
  702. {
  703. if (leftFlag)
  704. {
  705. leftFlag = false;//释放鼠标后标注为false;
  706. }
  707. }
  708. private void pDialog_MouseMove(object sender, MouseEventArgs e)
  709. {
  710. if (leftFlag)//判断鼠标左键有没有被按下
  711. {
  712. System.Drawing.Point mouseSet = Control.MousePosition;//获取屏幕中鼠标所在的位置
  713. mouseSet.Offset(mouseOff.X, mouseOff.Y);//设置移动后的位置
  714. pDialog.Location = mouseSet;
  715. }
  716. }
  717. private void picClose_Click(object sender, EventArgs e)
  718. {
  719. pDialog.Visible = false;
  720. }
  721. private void trackBar1_Scroll(object sender, EventArgs e)
  722. {
  723. try
  724. {
  725. if (trackBarType.Equals("Emergence"))
  726. {
  727. ImageModifyBefore();
  728. float mSize = float.Parse("0." + trackBar1.Value.ToString());
  729. Mat src = new Mat(filePath, ImreadModes.Color);
  730. int width = src.Cols;
  731. int heigh = src.Rows;
  732. int centerX = width >> 1;
  733. int centerY = heigh >> 1;
  734. int maxV = centerX * centerX + centerY * centerY;
  735. int minV = (int)(maxV * (1 - mSize));
  736. int diff = maxV - minV;
  737. float ratio = width > heigh ? (float)heigh / (float)width : (float)width / (float)heigh;
  738. Mat img = new Mat();
  739. src.CopyTo(img);
  740. Scalar avg = Cv2.Mean(src);
  741. Mat dst = new Mat(img.Size(), MatType.CV_8UC3);
  742. unsafe
  743. {
  744. for (int y = 0; y < heigh; y++)
  745. {
  746. IntPtr a = src.Ptr(y);
  747. byte* p0 = (byte*)a.ToPointer();
  748. IntPtr b = dst.Ptr(y);
  749. byte* p1 = (byte*)b.ToPointer();
  750. for (int x = 0; x < width; x++)
  751. {
  752. int b1 = p0[3 * x];
  753. int g = p0[3 * x + 1];
  754. int r = p0[3 * x + 2];
  755. float dx = centerX - x;
  756. float dy = centerY - y;
  757. if (width > heigh)
  758. dx = (dx * ratio);
  759. else
  760. dy = (dy * ratio);
  761. float dstSq = dx * dx + dy * dy;
  762. float v = ((float)dstSq / diff) * 255;
  763. r = (int)(r + v);
  764. g = (int)(g + v);
  765. b1 = (int)(b1 + v);
  766. r = (r > 255 ? 255 : (r < 0 ? 0 : r));
  767. g = (g > 255 ? 255 : (g < 0 ? 0 : g));
  768. b1 = (b1 > 255 ? 255 : (b1 < 0 ? 0 : b1));
  769. p1[3 * x] = (byte)b1;
  770. p1[3 * x + 1] = (byte)g;
  771. p1[3 * x + 2] = (byte)r;
  772. }
  773. }
  774. }
  775. dst.SaveImage(filePath);
  776. ImageModifyAfter();
  777. }
  778. else if (trackBarType.Equals("SobelThresholding"))
  779. {
  780. ImageModifyBefore();
  781. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  782. Mat sobelX = new Mat();
  783. Cv2.Sobel(image, sobelX, MatType.CV_8U, 1, 0, 3, 0.4, 128);
  784. Mat sobelY = new Mat();
  785. Cv2.Sobel(image, sobelY, MatType.CV_8U, 0, 1, 3, 0.4, 128);
  786. Cv2.Sobel(image, sobelX, MatType.CV_16S, 1, 0);
  787. Cv2.Sobel(image, sobelY, MatType.CV_16S, 0, 1);
  788. Mat sobel;
  789. // 计算L1模
  790. sobel = sobelX.Abs() + sobelY.Abs();
  791. double sobmin, sobmax;
  792. OpenCvSharp.Point minLoc, maxLoc;
  793. Cv2.MinMaxLoc(sobel, out sobmin, out sobmax, out minLoc, out maxLoc);
  794. Mat sobelL1Image = new Mat();
  795. sobel.ConvertTo(sobelL1Image, MatType.CV_8U, -255.0 / sobmax, 255);
  796. Mat sobelThresholded = new Mat();
  797. double threshold = double.Parse(trackBar1.Value.ToString());
  798. Cv2.Threshold(sobelL1Image, sobelThresholded, threshold, 255, ThresholdTypes.Binary);
  799. sobelThresholded.SaveImage(filePath);
  800. ImageModifyAfter();
  801. }
  802. else if (trackBarType.Equals("FixThresholding"))
  803. {
  804. ImageModifyBefore();
  805. Mat src = new Mat(filePath, ImreadModes.Grayscale);
  806. Mat OutImage1 = new Mat();
  807. Cv2.Threshold(src, OutImage1, trackBar1.Value, 255, ThresholdTypes.Binary);//固定阈值分割
  808. OutImage1.SaveImage(filePath);
  809. ImageModifyAfter();
  810. }
  811. else if (trackBarType.Equals("Hue"))
  812. {
  813. ImageModifyBefore();
  814. Mat image = new Mat(filePath, ImreadModes.Color);
  815. Mat hsv = new Mat();
  816. Cv2.CvtColor(image, hsv, ColorConversionCodes.BGR2HSV);
  817. Mat[] channels = Cv2.Split(hsv);
  818. for (int i = 0; i < channels[0].Rows; i++)//遍历所有像素
  819. {
  820. for (int j = 0; j < channels[0].Cols; j++)
  821. {
  822. channels[0].Set(i, j, trackBar1.Value);//改变亮度
  823. }
  824. }
  825. Cv2.Merge(channels, hsv);//合并通道
  826. Mat newImage = new Mat();
  827. Cv2.CvtColor(hsv, newImage, ColorConversionCodes.HSV2BGR);
  828. newImage.SaveImage(filePath);
  829. ImageModifyAfter();
  830. }
  831. else if (trackBarType.Equals("Brightness"))
  832. {
  833. ImageModifyBefore();
  834. Mat image = new Mat(filePath, ImreadModes.Color);
  835. Mat hsv = new Mat();
  836. Cv2.CvtColor(image, hsv, ColorConversionCodes.BGR2HSV);
  837. Mat[] channels = Cv2.Split(hsv);
  838. for (int i = 0; i < channels[2].Rows; i++)//遍历所有像素
  839. {
  840. for (int j = 0; j < channels[2].Cols; j++)
  841. {
  842. channels[2].Set(i, j, trackBar1.Value);//改变亮度
  843. }
  844. }
  845. Cv2.Merge(channels, hsv);//合并通道
  846. Mat newImage = new Mat();
  847. Cv2.CvtColor(hsv, newImage, ColorConversionCodes.HSV2BGR);
  848. newImage.SaveImage(filePath);
  849. ImageModifyAfter();
  850. }
  851. else if (trackBarType.Equals("Saturation"))
  852. {
  853. ImageModifyBefore();
  854. Mat image = new Mat(filePath, ImreadModes.Color);
  855. Mat hsv = new Mat();
  856. Cv2.CvtColor(image, hsv, ColorConversionCodes.BGR2HSV);
  857. Mat[] channels = Cv2.Split(hsv);
  858. for (int i = 0; i < channels[1].Rows; i++)//遍历所有像素
  859. {
  860. for (int j = 0; j < channels[1].Cols; j++)
  861. {
  862. channels[1].Set(i, j, trackBar1.Value);//改变亮度
  863. }
  864. }
  865. Cv2.Merge(channels, hsv);//合并通道
  866. Mat newImage = new Mat();
  867. Cv2.CvtColor(hsv, newImage, ColorConversionCodes.HSV2BGR);
  868. newImage.SaveImage(filePath);
  869. ImageModifyAfter();
  870. }
  871. }
  872. catch (Exception exp)
  873. {
  874. MessageBox.Show(exp.ToString());
  875. return;
  876. }
  877. }
  878. private void tsmiHue_Click(object sender, EventArgs e)
  879. {
  880. if (pDialog.Visible)
  881. {
  882. MessageBox.Show("滑块窗口已经打开,请先关闭滑块窗口");
  883. return;
  884. }
  885. pDialog.Visible = true;
  886. pDialog.BringToFront();
  887. trackBar1.Maximum = 255;
  888. trackBarType = "";
  889. trackBar1.Value = 0;
  890. trackBarType = "Hue";
  891. }
  892. private void tsmiBrightness_Click(object sender, EventArgs e)
  893. {
  894. if (pDialog.Visible)
  895. {
  896. MessageBox.Show("滑块窗口已经打开,请先关闭滑块窗口");
  897. return;
  898. }
  899. pDialog.Visible = true;
  900. pDialog.BringToFront();
  901. trackBar1.Maximum = 255;
  902. trackBarType = "";
  903. trackBar1.Value = 0;
  904. trackBarType = "Brightness";
  905. }
  906. private void tsmiSaturation_Click(object sender, EventArgs e)
  907. {
  908. if (pDialog.Visible)
  909. {
  910. MessageBox.Show("滑块窗口已经打开,请先关闭滑块窗口");
  911. return;
  912. }
  913. pDialog.Visible = true;
  914. pDialog.BringToFront();
  915. trackBar1.Maximum = 255;
  916. trackBarType = "";
  917. trackBar1.Value = 0;
  918. trackBarType = "Saturation";
  919. }
  920. private void tsmiBoxFilter_Click(object sender, EventArgs e)
  921. {
  922. try
  923. {
  924. ImageModifyBefore();
  925. Mat image = new Mat(filePath, ImreadModes.Color);
  926. Mat out1 = new Mat();
  927. Cv2.BoxFilter(image, out1, -1, new OpenCvSharp.Size(5, 5));
  928. out1.SaveImage(filePath);
  929. ImageModifyAfter();
  930. }
  931. catch (Exception exp)
  932. {
  933. MessageBox.Show(exp.ToString());
  934. return;
  935. }
  936. }
  937. private void tsmiMeanFilter_Click(object sender, EventArgs e)
  938. {
  939. try
  940. {
  941. ImageModifyBefore();
  942. Mat image = new Mat(filePath, ImreadModes.Color);
  943. Mat dstImage = new Mat();
  944. Cv2.Blur(image, dstImage, new OpenCvSharp.Size(5, 5));
  945. dstImage.SaveImage(filePath);
  946. ImageModifyAfter();
  947. }
  948. catch (Exception exp)
  949. {
  950. MessageBox.Show(exp.ToString());
  951. return;
  952. }
  953. }
  954. private void tsmiGaussianFilter_Click(object sender, EventArgs e)
  955. {
  956. try
  957. {
  958. ImageModifyBefore();
  959. Mat image = new Mat(filePath, ImreadModes.Color);
  960. Mat dstImage = new Mat();
  961. Cv2.GaussianBlur(image, dstImage, new OpenCvSharp.Size(5, 5), 0, 0);
  962. dstImage.SaveImage(filePath);
  963. ImageModifyAfter();
  964. }
  965. catch (Exception exp)
  966. {
  967. MessageBox.Show(exp.ToString());
  968. return;
  969. }
  970. }
  971. private void tsmiMedianFilter_Click(object sender, EventArgs e)
  972. {
  973. try
  974. {
  975. ImageModifyBefore();
  976. Mat image = new Mat(filePath, ImreadModes.Color);
  977. Mat dstImage = new Mat();
  978. Cv2.MedianBlur(image, dstImage, 5);
  979. dstImage.SaveImage(filePath);
  980. ImageModifyAfter();
  981. }
  982. catch (Exception exp)
  983. {
  984. MessageBox.Show(exp.ToString());
  985. return;
  986. }
  987. }
  988. private void tsmiBilateralFilter_Click(object sender, EventArgs e)
  989. {
  990. try
  991. {
  992. ImageModifyBefore();
  993. Mat image = new Mat(filePath, ImreadModes.Color);
  994. Mat dstImage = new Mat();
  995. Cv2.BilateralFilter(image, dstImage, 25, 25 * 2, 25 / 2);
  996. dstImage.SaveImage(filePath);
  997. ImageModifyAfter();
  998. }
  999. catch (Exception exp)
  1000. {
  1001. MessageBox.Show(exp.ToString());
  1002. return;
  1003. }
  1004. }
  1005. private void tsmiExpansion_Click(object sender, EventArgs e)
  1006. {
  1007. try
  1008. {
  1009. ImageModifyBefore();
  1010. Mat image = new Mat(filePath, ImreadModes.Color);
  1011. Mat dstImage = new Mat();
  1012. Cv2.Erode(image, dstImage, new Mat());
  1013. dstImage.SaveImage(filePath);
  1014. ImageModifyAfter();
  1015. }
  1016. catch (Exception exp)
  1017. {
  1018. MessageBox.Show(exp.ToString());
  1019. return;
  1020. }
  1021. }
  1022. private void tsmiCorrosion_Click(object sender, EventArgs e)
  1023. {
  1024. try
  1025. {
  1026. ImageModifyBefore();
  1027. Mat image = new Mat(filePath, ImreadModes.Color);
  1028. Mat dstImage = new Mat();
  1029. Cv2.Dilate(image, dstImage, new Mat());
  1030. dstImage.SaveImage(filePath);
  1031. ImageModifyAfter();
  1032. }
  1033. catch (Exception exp)
  1034. {
  1035. MessageBox.Show(exp.ToString());
  1036. return;
  1037. }
  1038. }
  1039. private void tsmiOpenOperation_Click(object sender, EventArgs e)
  1040. {
  1041. try
  1042. {
  1043. ImageModifyBefore();
  1044. Mat image = new Mat(filePath, ImreadModes.Color);
  1045. Mat element5 = new Mat(5, 5, MatType.CV_8U, new Scalar(1));
  1046. Mat dstImage = new Mat();
  1047. Cv2.MorphologyEx(image, dstImage, MorphTypes.Open, element5);
  1048. dstImage.SaveImage(filePath);
  1049. ImageModifyAfter();
  1050. }
  1051. catch (Exception exp)
  1052. {
  1053. MessageBox.Show(exp.ToString());
  1054. return;
  1055. }
  1056. }
  1057. private void tsmiCloseOperation_Click(object sender, EventArgs e)
  1058. {
  1059. try
  1060. {
  1061. ImageModifyBefore();
  1062. Mat image = new Mat(filePath, ImreadModes.Color);
  1063. Mat element5 = new Mat(5, 5, MatType.CV_8U, new Scalar(1));
  1064. Mat dstImage = new Mat();
  1065. Cv2.MorphologyEx(image, dstImage, MorphTypes.Close, element5);
  1066. dstImage.SaveImage(filePath);
  1067. ImageModifyAfter();
  1068. }
  1069. catch (Exception exp)
  1070. {
  1071. MessageBox.Show(exp.ToString());
  1072. return;
  1073. }
  1074. }
  1075. private void tsmiMorphologicalGradient_Click(object sender, EventArgs e)
  1076. {
  1077. try
  1078. {
  1079. ImageModifyBefore();
  1080. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1081. Mat element5 = new Mat(5, 5, MatType.CV_8U, new Scalar(1));
  1082. Mat dstImage = new Mat();
  1083. Cv2.MorphologyEx(image, dstImage, MorphTypes.Gradient, element5);
  1084. dstImage.SaveImage(filePath);
  1085. ImageModifyAfter();
  1086. }
  1087. catch (Exception exp)
  1088. {
  1089. MessageBox.Show(exp.ToString());
  1090. return;
  1091. }
  1092. }
  1093. private void tsmiTopHat_Click(object sender, EventArgs e)
  1094. {
  1095. try
  1096. {
  1097. ImageModifyBefore();
  1098. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1099. Mat element5 = new Mat(5, 5, MatType.CV_8U, new Scalar(1));
  1100. Mat dstImage = new Mat();
  1101. Cv2.MorphologyEx(image, dstImage, MorphTypes.TopHat, element5);
  1102. dstImage.SaveImage(filePath);
  1103. ImageModifyAfter();
  1104. }
  1105. catch (Exception exp)
  1106. {
  1107. MessageBox.Show(exp.ToString());
  1108. return;
  1109. }
  1110. }
  1111. private void tsmiBlackHat_Click(object sender, EventArgs e)
  1112. {
  1113. try
  1114. {
  1115. ImageModifyBefore();
  1116. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1117. Mat element5 = new Mat(5, 5, MatType.CV_8U, new Scalar(1));
  1118. Mat dstImage = new Mat();
  1119. Cv2.MorphologyEx(image, dstImage, MorphTypes.BlackHat, element5);
  1120. dstImage.SaveImage(filePath);
  1121. ImageModifyAfter();
  1122. }
  1123. catch (Exception exp)
  1124. {
  1125. MessageBox.Show(exp.ToString());
  1126. return;
  1127. }
  1128. }
  1129. private void tsmiNostalgia_Click(object sender, EventArgs e)
  1130. {
  1131. try
  1132. {
  1133. ImageModifyBefore();
  1134. Mat src = new Mat(filePath, ImreadModes.Color);
  1135. Mat dstImage = new Mat(src.Size(), MatType.CV_8UC3);
  1136. int width = src.Cols;
  1137. int heigh = src.Rows;
  1138. unsafe
  1139. {
  1140. for (int y = 0; y < heigh; y++)
  1141. {
  1142. IntPtr a = src.Ptr(y);
  1143. byte* p0 = (byte*)a.ToPointer();
  1144. IntPtr b = dstImage.Ptr(y);
  1145. byte* p1 = (byte*)b.ToPointer();
  1146. for (int x = 0; x < width; x++)
  1147. {
  1148. float B = p0[3 * x];
  1149. float G = p0[3 * x + 1];
  1150. float R = p0[3 * x + 2];
  1151. double newB = 0.272 * R + 0.534 * G + 0.131 * B;
  1152. double newG = 0.349 * R + 0.686 * G + 0.168 * B;
  1153. double newR = 0.393 * R + 0.769 * G + 0.189 * B;
  1154. if (newB < 0) newB = 0;
  1155. if (newB > 255) newB = 255;
  1156. if (newG < 0) newG = 0;
  1157. if (newG > 255) newG = 255;
  1158. if (newR < 0) newR = 0;
  1159. if (newR > 255) newR = 255;
  1160. p1[3 * x] = (byte)newB;
  1161. p1[3 * x + 1] = (byte)newG;
  1162. p1[3 * x + 2] = (byte)newR;
  1163. }
  1164. }
  1165. }
  1166. dstImage.SaveImage(filePath);
  1167. ImageModifyAfter();
  1168. }
  1169. catch (Exception exp)
  1170. {
  1171. MessageBox.Show(exp.ToString());
  1172. return;
  1173. }
  1174. }
  1175. private void tsmiFrost_Click(object sender, EventArgs e)
  1176. {
  1177. try
  1178. {
  1179. ImageModifyBefore();
  1180. Mat src = new Mat(filePath, ImreadModes.Color);
  1181. Mat dstImage = new Mat(src.Size(), MatType.CV_8UC3);
  1182. int width = src.Cols;
  1183. int heigh = src.Rows;
  1184. unsafe
  1185. {
  1186. for (int y = 0; y < heigh; y++)
  1187. {
  1188. IntPtr a = src.Ptr(y);
  1189. byte* p0 = (byte*)a.ToPointer();
  1190. IntPtr b = dstImage.Ptr(y);
  1191. byte* p1 = (byte*)b.ToPointer();
  1192. for (int x = 0; x < width; x++)
  1193. {
  1194. float b0 = p0[3 * x];
  1195. float g0 = p0[3 * x + 1];
  1196. float r0 = p0[3 * x + 2];
  1197. float b1 = (b0 - g0 - r0) * 3 / 2;
  1198. float g = (g0 - b0 - r0) * 3 / 2;
  1199. float r = (r0 - g0 - b0) * 3 / 2;
  1200. r = (r > 255 ? 255 : (r < 0 ? -r : r));
  1201. g = (g > 255 ? 255 : (g < 0 ? -g : g));
  1202. b1 = (b1 > 255 ? 255 : (b1 < 0 ? -b1 : b1));
  1203. p1[3 * x] = (byte)b1;
  1204. p1[3 * x + 1] = (byte)g;
  1205. p1[3 * x + 2] = (byte)r;
  1206. }
  1207. }
  1208. }
  1209. dstImage.SaveImage(filePath);
  1210. ImageModifyAfter();
  1211. }
  1212. catch (Exception exp)
  1213. {
  1214. MessageBox.Show(exp.ToString());
  1215. return;
  1216. }
  1217. }
  1218. private void tsmiCasting_Click(object sender, EventArgs e)
  1219. {
  1220. try
  1221. {
  1222. ImageModifyBefore();
  1223. Mat src = new Mat(filePath, ImreadModes.Color);
  1224. Mat dstImage = new Mat(src.Size(), MatType.CV_8UC3);
  1225. int width = src.Cols;
  1226. int heigh = src.Rows;
  1227. unsafe
  1228. {
  1229. for (int y = 0; y < heigh; y++)
  1230. {
  1231. IntPtr a = src.Ptr(y);
  1232. byte* p0 = (byte*)a.ToPointer();
  1233. IntPtr b = dstImage.Ptr(y);
  1234. byte* p1 = (byte*)b.ToPointer();
  1235. for (int x = 0; x < width; x++)
  1236. {
  1237. float b0 = p0[3 * x];
  1238. float g0 = p0[3 * x + 1];
  1239. float r0 = p0[3 * x + 2];
  1240. float b1 = b0 * 255 / (g0 + r0 + 1);
  1241. float g = g0 * 255 / (b0 + r0 + 1);
  1242. float r = r0 * 255 / (g0 + b0 + 1);
  1243. r = (r > 255 ? 255 : (r < 0 ? 0 : r));
  1244. g = (g > 255 ? 255 : (g < 0 ? 0 : g));
  1245. b1 = (b1 > 255 ? 255 : (b1 < 0 ? 0 : b1));
  1246. p1[3 * x] = (byte)b1;
  1247. p1[3 * x + 1] = (byte)g;
  1248. p1[3 * x + 2] = (byte)r;
  1249. }
  1250. }
  1251. }
  1252. dstImage.SaveImage(filePath);
  1253. ImageModifyAfter();
  1254. }
  1255. catch (Exception exp)
  1256. {
  1257. MessageBox.Show(exp.ToString());
  1258. return;
  1259. }
  1260. }
  1261. private void tsmiGrayscale_Click(object sender, EventArgs e)
  1262. {
  1263. try
  1264. {
  1265. ImageModifyBefore();
  1266. Mat dstImage = new Mat(filePath, ImreadModes.Grayscale);
  1267. dstImage.SaveImage(filePath);
  1268. ImageModifyAfter();
  1269. }
  1270. catch (Exception exp)
  1271. {
  1272. MessageBox.Show(exp.ToString());
  1273. return;
  1274. }
  1275. }
  1276. private void tsmiEmergence_Click(object sender, EventArgs e)
  1277. {
  1278. try
  1279. {
  1280. if (pDialog.Visible)
  1281. {
  1282. MessageBox.Show("滑块窗口已经打开,请先关闭滑块窗口");
  1283. return;
  1284. }
  1285. pDialog.Visible = true;
  1286. pDialog.BringToFront();
  1287. trackBar1.Maximum = 9;
  1288. trackBarType = "";
  1289. trackBar1.Value = 0;
  1290. trackBarType = "Emergence";
  1291. }
  1292. catch (Exception exp)
  1293. {
  1294. MessageBox.Show(exp.ToString());
  1295. return;
  1296. }
  1297. }
  1298. private void tsmiSobelX_Click(object sender, EventArgs e)
  1299. {
  1300. try
  1301. {
  1302. ImageModifyBefore();
  1303. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1304. Mat dstImage = new Mat();
  1305. Cv2.Sobel(image, dstImage, MatType.CV_8U, 1, 0, 3, 0.4, 128);
  1306. dstImage.SaveImage(filePath);
  1307. ImageModifyAfter();
  1308. }
  1309. catch (Exception exp)
  1310. {
  1311. MessageBox.Show(exp.ToString());
  1312. return;
  1313. }
  1314. }
  1315. private void tsmiSobelY_Click(object sender, EventArgs e)
  1316. {
  1317. try
  1318. {
  1319. ImageModifyBefore();
  1320. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1321. Mat dstImage = new Mat();
  1322. Cv2.Sobel(image, dstImage, MatType.CV_8U, 0, 1, 3, 0.4, 128);
  1323. dstImage.SaveImage(filePath);
  1324. ImageModifyAfter();
  1325. }
  1326. catch (Exception exp)
  1327. {
  1328. MessageBox.Show(exp.ToString());
  1329. return;
  1330. }
  1331. }
  1332. private void tsmiSobelMode_Click(object sender, EventArgs e)
  1333. {
  1334. try
  1335. {
  1336. ImageModifyBefore();
  1337. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1338. Mat sobelX = new Mat();
  1339. Cv2.Sobel(image, sobelX, MatType.CV_8U, 1, 0, 3, 0.4, 128);
  1340. Mat sobelY = new Mat();
  1341. Cv2.Sobel(image, sobelY, MatType.CV_8U, 0, 1, 3, 0.4, 128);
  1342. Cv2.Sobel(image, sobelX, MatType.CV_16S, 1, 0);
  1343. Cv2.Sobel(image, sobelY, MatType.CV_16S, 0, 1);
  1344. Mat sobel;
  1345. // 计算L1模
  1346. sobel = sobelX.Abs() + sobelY.Abs();
  1347. double sobmin, sobmax;
  1348. OpenCvSharp.Point minLoc, maxLoc;
  1349. Cv2.MinMaxLoc(sobel, out sobmin, out sobmax, out minLoc, out maxLoc);
  1350. Mat dstImage = new Mat();
  1351. sobel.ConvertTo(dstImage, MatType.CV_8U, -255.0 / sobmax, 255);
  1352. dstImage.SaveImage(filePath);
  1353. ImageModifyAfter();
  1354. }
  1355. catch (Exception exp)
  1356. {
  1357. MessageBox.Show(exp.ToString());
  1358. return;
  1359. }
  1360. }
  1361. private void tsmiSobelThresholding_Click(object sender, EventArgs e)
  1362. {
  1363. try
  1364. {
  1365. if (pDialog.Visible)
  1366. {
  1367. MessageBox.Show("滑块窗口已经打开,请先关闭滑块窗口");
  1368. return;
  1369. }
  1370. pDialog.Visible = true;
  1371. pDialog.BringToFront();
  1372. trackBar1.Maximum = 255;
  1373. trackBarType = "";
  1374. trackBar1.Value = 0;
  1375. trackBarType = "SobelThresholding";
  1376. }
  1377. catch (Exception exp)
  1378. {
  1379. MessageBox.Show(exp.ToString());
  1380. return;
  1381. }
  1382. }
  1383. private void tsmiLaplace_Click(object sender, EventArgs e)
  1384. {
  1385. try
  1386. {
  1387. ImageModifyBefore();
  1388. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1389. Mat dst = new Mat();
  1390. Mat dstImage = new Mat();
  1391. Cv2.Laplacian(image, dst, MatType.CV_16S, 3, 1, 0, BorderTypes.Default);
  1392. Cv2.ConvertScaleAbs(dst, dstImage);
  1393. dstImage.SaveImage(filePath);
  1394. ImageModifyAfter();
  1395. }
  1396. catch (Exception exp)
  1397. {
  1398. MessageBox.Show(exp.ToString());
  1399. return;
  1400. }
  1401. }
  1402. private void tsmiCanny_Click(object sender, EventArgs e)
  1403. {
  1404. try
  1405. {
  1406. ImageModifyBefore();
  1407. //Mat dstImage = new Mat(filePath, ImreadModes.Grayscale);
  1408. //dstImage.SaveImage(filePath);
  1409. ImageModifyAfter();
  1410. }
  1411. catch (Exception exp)
  1412. {
  1413. MessageBox.Show(exp.ToString());
  1414. return;
  1415. }
  1416. }
  1417. private void tsmiScharrX_Click(object sender, EventArgs e)
  1418. {
  1419. try
  1420. {
  1421. ImageModifyBefore();
  1422. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1423. Mat grad_x = new Mat();
  1424. Mat dstImage = new Mat();
  1425. Cv2.Scharr(image, grad_x, MatType.CV_16S, 1, 0, 1, 0, BorderTypes.Default);
  1426. Cv2.ConvertScaleAbs(grad_x, dstImage);
  1427. dstImage.SaveImage(filePath);
  1428. ImageModifyAfter();
  1429. }
  1430. catch (Exception exp)
  1431. {
  1432. MessageBox.Show(exp.ToString());
  1433. return;
  1434. }
  1435. }
  1436. private void tsmiScharrY_Click(object sender, EventArgs e)
  1437. {
  1438. try
  1439. {
  1440. ImageModifyBefore();
  1441. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1442. Mat grad_y = new Mat();
  1443. Mat dstImage = new Mat();
  1444. Mat dst = new Mat();
  1445. Cv2.Scharr(image, grad_y, MatType.CV_16S, 0, 1, 1, 0, BorderTypes.Default);
  1446. Cv2.ConvertScaleAbs(grad_y, dstImage);
  1447. dstImage.SaveImage(filePath);
  1448. ImageModifyAfter();
  1449. }
  1450. catch (Exception exp)
  1451. {
  1452. MessageBox.Show(exp.ToString());
  1453. return;
  1454. }
  1455. }
  1456. private void tsmiMergeGradients_Click(object sender, EventArgs e)
  1457. {
  1458. try
  1459. {
  1460. ImageModifyBefore();
  1461. Mat image = new Mat(filePath, ImreadModes.Grayscale);
  1462. Mat grad_x = new Mat();
  1463. Mat abs_grad_x = new Mat();
  1464. Cv2.Scharr(image, grad_x, MatType.CV_16S, 1, 0, 1, 0, BorderTypes.Default);
  1465. Cv2.ConvertScaleAbs(grad_x, abs_grad_x);
  1466. Mat grad_y = new Mat();
  1467. Mat abs_grad_y = new Mat();
  1468. Mat dstImage = new Mat();
  1469. Cv2.Scharr(image, grad_y, MatType.CV_16S, 0, 1, 1, 0, BorderTypes.Default);
  1470. Cv2.ConvertScaleAbs(grad_y, abs_grad_y);
  1471. Cv2.AddWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dstImage);
  1472. dstImage.SaveImage(filePath);
  1473. ImageModifyAfter();
  1474. }
  1475. catch (Exception exp)
  1476. {
  1477. MessageBox.Show(exp.ToString());
  1478. return;
  1479. }
  1480. }
  1481. private void tsmiFixThresholding_Click(object sender, EventArgs e)
  1482. {
  1483. if (pDialog.Visible)
  1484. {
  1485. MessageBox.Show("滑块窗口已经打开,请先关闭滑块窗口");
  1486. return;
  1487. }
  1488. pDialog.Visible = true;
  1489. pDialog.BringToFront();
  1490. trackBar1.Maximum = 255;
  1491. trackBarType = "";
  1492. trackBar1.Value = 0;
  1493. trackBarType = "FixThresholding";
  1494. }
  1495. private void tsmiSelfThresholding_Click(object sender, EventArgs e)
  1496. {
  1497. try
  1498. {
  1499. ImageModifyBefore();
  1500. Mat src = new Mat(filePath, ImreadModes.Grayscale);
  1501. Mat OutImage1 = new Mat();
  1502. Mat OutImage2 = new Mat();
  1503. Cv2.AdaptiveThreshold(src, OutImage2, 255, AdaptiveThresholdTypes.MeanC, ThresholdTypes.Binary, 31, 10);//自适应阈值分割
  1504. OutImage2.SaveImage(filePath);
  1505. ImageModifyAfter();
  1506. }
  1507. catch (Exception exp)
  1508. {
  1509. MessageBox.Show(exp.ToString());
  1510. return;
  1511. }
  1512. }
  1513. private void tsmiComic_Click(object sender, EventArgs e)
  1514. {
  1515. try
  1516. {
  1517. ImageModifyBefore();
  1518. Mat src1 = new Mat(filePath, ImreadModes.Color);
  1519. Mat img = new Mat();
  1520. Cv2.BilateralFilter(src1, img, 5, 150, 150);
  1521. Cv2.BilateralFilter(img, src1, 5, 150, 150);
  1522. Mat src = new Mat();
  1523. Cv2.CvtColor(src1, src, ColorConversionCodes.BGR2GRAY);
  1524. Mat imgL = new Mat();
  1525. Mat imgC = new Mat();
  1526. Cv2.Canny(src, imgC, 30, 90);
  1527. Mat imgS = new Mat();
  1528. Mat imgSx = new Mat();
  1529. Mat imgSy = new Mat();
  1530. Mat imgS0 = new Mat();
  1531. Cv2.Sobel(src, imgSx, -1, 0, 1);
  1532. Cv2.Sobel(src, imgSy, -1, 1, 0);
  1533. imgS = imgSx + imgSy;
  1534. Cv2.Sobel(src, imgS0, -1, 1, 1);
  1535. Mat imgTotal = new Mat();
  1536. imgTotal = imgC + imgS + imgL;
  1537. //imgTotal.convertTo(imgTotal,CV_32FC1);
  1538. Cv2.Normalize(imgTotal, imgTotal, 255, 0, NormTypes.MinMax);
  1539. Cv2.GaussianBlur(imgTotal, imgTotal, new OpenCvSharp.Size(3, 3), 3);
  1540. Cv2.Threshold(imgTotal, imgTotal, 100, 255, ThresholdTypes.BinaryInv);
  1541. Mat imgTotalC3 = new Mat();
  1542. Cv2.CvtColor(imgTotal, imgTotalC3, ColorConversionCodes.GRAY2BGR);
  1543. Cv2.BitwiseAnd(src1, imgTotalC3, src1);
  1544. src1.SaveImage(filePath);
  1545. ImageModifyAfter();
  1546. }
  1547. catch (Exception exp)
  1548. {
  1549. MessageBox.Show(exp.ToString());
  1550. return;
  1551. }
  1552. }
  1553. }
  1554. }