Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

Halcon+Winform实现图像缩放等功能

blog.csdn.net/jgj123321/article/details/96479014

Halcon 专栏收录该内容

39 篇文章 5 订阅

订阅专栏
初始化窗口

1)图片控件为winform中的PictureBox控件时:

需要调用halcon算子OpenWindow来初始化窗口,使winform中的图片窗口转换为适用于
halcon的图片窗口。

2)图片控件为halcon中的HWindowControl控件时:

无需进行窗口转换,可直接按照如下方式调用。

WindowID = hWindowControl1.HalconWindow。

添加图像缩放功能

打开Form窗体——查看图片控件属性——点击“事件”选项——找到鼠标滚轮滑动的事件,双
击创建响应函数——将相应的代码放在刚刚添加的函数中,如下图所示:

1/7
添加图像平移功能

按照上述步骤分别找到鼠标“按下”与“抬起”的事件,分别双击创建响应函数,然后将相应的
代码放在刚刚添加的函数中。如下图所示:

添加实时显示灰度值功能

按照上述步骤找到鼠标移动的事件,双击创建响应函数——在界面上添加一个“label”控件,
然后将相应的代码放在刚刚添加的函数中。

代码:

2/7
1. using System;

2. using System.Collections.Generic;

3. using System.ComponentModel;

4. using System.Data;

5. using System.Drawing;

6. using System.Linq;

7. using System.Text;

8. using System.Threading.Tasks;

9. using System.Windows.Forms;

10. using HalconDotNet;

11. namespace CSharpAndHalcon12

12. {

13. public partial class Form1 : Form

14. {

15. HTuple WindowID, ImageWidth, ImageHeight;

16. private double RowDown;//鼠标按下时的行坐标

17. private double ColDown;//鼠标按下时的列坐标

18. HObject ho_image; //图像变量

19. public Form1()

20. {

21. InitializeComponent();

22. CreateHalconWindow();

23. }

24. //创建Halcon窗口

25. public void CreateHalconWindow()

26. {

27. // ///图片控件为winform中的PictureBox控件时/

28. //HTuple FatherWindow = this.hWindowControl1.Handle;

29. //HOperatorSet.SetWindowAttr("background_color", "green");

30. //HOperatorSet.OpenWindow(0, 0, this.hWindowControl1.Width,


this.hWindowControl1.Height, FatherWindow, "visible", "", out WindowID);

3/7
31. /图片控件为halcon中的HWindowControl控件时/

32. WindowID = hWindowControl1.HalconWindow;

33. }

34. //读图

35. private void button1_Click(object sender, EventArgs e)

36. {

37. OpenFileDialog openFileDialog = new OpenFileDialog();

38. //openFileDialog.Filter = "JPEG文件|*.jpg*|BMP文件|*.bmp*|TIFF文


件|*.tiff*";

39. openFileDialog.Filter = "所有图像文件 | *.bmp; *.pcx; *.png; *.jpg;


*.gif;*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf";

40. if (openFileDialog.ShowDialog() == DialogResult.OK)

41. {

42. HTuple ImagePath = openFileDialog.FileName;

43. HOperatorSet.ReadImage(out ho_image, ImagePath);

44. }

45. HOperatorSet.GetImageSize(ho_image, out ImageWidth, out


ImageHeight);

46. HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight, ImageWidth);

47. HOperatorSet.DispObj(ho_image, WindowID);

48. }

49. //缩放图像

50. private void hWindowControl1_HMouseWheel(object sender,


HMouseEventArgs e)

51. {

52. HTuple Zoom, Row, Col, Button;

53. HTuple Row0, Column0, Row00, Column00, Ht, Wt, r1, c1, r2, c2;

54. if (e.Delta > 0)

55. {

56. Zoom = 1.5;

57. }

58. else

59. {

4/7
60. Zoom = 0.5;

61. }

62. HOperatorSet.GetMposition(WindowID, out Row, out Col, out


Button);

63. HOperatorSet.GetPart(WindowID, out Row0, out Column0, out Row00,


out Column00);

64. Ht = Row00 - Row0;

65. Wt = Column00 - Column0;

66. if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)//普通版halcon能处理的图


像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃

67. {

68. r1 = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));

69. c1 = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));

70. r2 = r1 + (Ht / Zoom);

71. c2 = c1 + (Wt / Zoom);

72. HOperatorSet.SetPart(WindowID, r1, c1, r2, c2);

73. HOperatorSet.ClearWindow(WindowID);

74. HOperatorSet.DispObj(ho_image, WindowID);

75. }

76. }

77. //鼠标按下,记录当前坐标值

78. private void hWindowControl1_HMouseDown(object sender,


HMouseEventArgs e)

79. {

80. HTuple Row, Column, Button;

81. HOperatorSet.GetMposition(WindowID, out Row, out Column, out


Button);

82. RowDown = Row; //鼠标按下时的行坐标

83. ColDown = Column; //鼠标按下时的列坐标

84. }

85. //鼠标抬起,实现图像移动

86. private void hWindowControl1_HMouseUp(object sender, HMouseEventArgs


e)

87. {

5/7
88. HTuple row1, col1, row2, col2,Row, Column, Button;

89. HOperatorSet.GetMposition(WindowID, out Row, out Column, out


Button);

90. double RowMove = Row - RowDown; //鼠标弹起时的行坐标减去按下时的行坐


标,得到行坐标的移动值

91. double ColMove = Column - ColDown;//鼠标弹起时的列坐标减去按下时的列坐


标,得到列坐标的移动值

92. HOperatorSet.GetPart(WindowID, out row1, out col1, out row2, out


col2);//得到当前的窗口坐标

93. HOperatorSet.SetPart(WindowID, row1 - RowMove, col1 - ColMove,


row2 - RowMove, col2 - ColMove);//这里可能有些不好理解。以左上角原点为参考点

94. HOperatorSet.ClearWindow(WindowID);

95. if (ImageHeight != null)

96. {

97. HOperatorSet.DispObj(ho_image, WindowID);

98. }

99. else

100. {

101. MessageBox.Show("请加载一张图片");

102. }

103. }

104. //鼠标移动,实时显示当前坐标与灰度值

105. private void hWindowControl1_HMouseMove(object sender,


HMouseEventArgs e)

106. {

107. HTuple Row, Column, Button, pointGray;

108. HOperatorSet.GetMposition(WindowID, out Row, out Column, out


Button); //获取当前鼠标的坐标值

109. if (ImageHeight != null && (Row > 0 && Row < ImageHeight) &&
(Column > 0 && Column < ImageWidth))//设置3个条件项,防止程序崩溃。

110. {

111. HOperatorSet.GetGrayval(ho_image, Row, Column, out


pointGray); //获取当前点的灰度值

112. }

113. else

6/7
114. {

115. pointGray = "_";

116. }

117. String str = String.Format("Row:{0} Column:{1} Gray:{2}", Row,


Column, pointGray); //格式化字符串

118. label1.Text = str;


//在label控件上显示数值

119. }

120. //全屏显示图像,使缩放后的图像回到原始大小

121. private void button_FullWindow_Click(object sender, EventArgs e)

122. {

123. HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight - 1, ImageWidth


- 1);

124. HOperatorSet.ClearWindow(WindowID);

125. HOperatorSet.DispObj(ho_image, WindowID);

126. }

127. }

128. }

7/7

You might also like