回顾
之前博文中,曾经提到,通过计算欲显示图片和窗口控件长、宽比例,对图像本身进行放缩,再进行显示的方法。
现在看来是因为当时对dev_set_part这个算子的理解不到位造成的。
Halcon/C#混合编程实现任意图片的原始长宽比显示+形状匹配定位
之前方法的缺点
之前的方法虽然也看似完成了目标,但是需要对图片本身进行放缩处理。这就使得在UI交互时,交互得到的位置坐标需要进行换算方可对应到图像的实际像素坐标。
正确的理解思路
想像我们有一张桌子,桌子上放了一个手机,现在我们用一个相机去给手机拍照,怎样让手机看起来占图片更大一些呢?
之前的方法相当于,我们把拍照用的相机位置固定了,然后,把真实世界的手机给放缩了。
正确的思路应该是,我们去调整相机的位置,远近,使手机在相片中的位置和大小显得变化了。事实上,真实的手机是没有办法放大和缩小的。
dev_set_part
这个算子其实就相当于是你用来拍照的相机。它一共有五个输入参数,第一个是窗口控件,后面四个是取景视野在真实世界中的左上角(列、行)和右下角坐标(列、行)。
实现
基于这个算子的功能,以下例证
dev_close_window ()
dev_open_window (0, 0, 400, 480, 'gray', WindowHandle)
set_window_param (WindowHandle, 'save_depth_buffer', 'true')
dev_clear_window ()
dev_update_window ('off')
dev_open_file_dialog ('read_image', 'default', 'default', Selection)
read_image (Image, Selection)
get_window_extents (WindowHandle, Row, Column, winWidth, winHeight)
showPicture (Image, winWidth, winHeight)
gen_rectroi (WindowHandle, winHeight, winWidth, Row3, Column3, Phi, Length1, Length2)
以下是showPicture的内容:
set_system ('int_zooming', 'false')
get_image_size (Image, Width, Height)
picWHRatio := 1.0 * Width / Height
winWHRatio := 1.0 * winWidth / winHeight
if (Width > winWidth or Height > winHeight)
* 如果图片宽高比 大于 窗口宽高比
* 则宽度方向顶格
if (picWHRatio >= winWHRatio)
dispWidth := Width
dispHeight := Width / winWHRatio
dev_set_part (0, 0, dispHeight, dispWidth)
dev_display (Image)
endif
* 如果图片宽高比 小于 窗口宽高比
* 则高度方向顶格
if (picWHRatio < winWHRatio)
dispWidth := Height * winWHRatio
dispHeight := Height
dev_set_part (0, 0, dispHeight, dispWidth)
dev_display (Image)
endif
else
* 如果图片的长和宽都小于窗口,则以图片的原真实尺寸显示
dev_set_part (0, 0, winHeight, winWidth)
dev_display (Image)
endif
return ()
以下是gen_rectroi的内容
dev_set_colored (3)
draw_rectangle2_mod (WindowHandle, winHeight/2.0-1, winWidth/2.0-1, 0, winWidth/4.0, winHeight/4.0, Row3, Column3, Phi, Length1, Length2)
dev_set_color ('green')
gen_rectangle2_contour_xld (Rectangle, Row3, Column3, Phi, Length1, Length2)
dev_display (Rectangle)
dev_set_colored (3)
return ()
验证
采用一张264×245大小的图片,窗口的大小设置为400×480
则得到的显示为
作为对比,如果不调整显示区域,则默认填充整个窗口