目的:在系列二的基础上,添加从文件中打开一幅图像的按钮。点击该按钮可以选择从文件或者当前目录下打开一幅图像。
按钮的事件响应函数如下:
void CHalconMFCDlg::OnBnClickedReadimage()
{
// TODO: Add your control notification handler code here
// HDevelop default window handle
char ReadImageModel = 0;
if (1 == ReadImageModel)
{
open_framegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", -1, "default",
"", "default", -1, -1, &AcqHandle);
grab_image(&Image, AcqHandle);
get_image_pointer1(Image, &Pointer, &Type, &Width, &Height);
set_window_attr("background_color","black");
set_part(WindowHandle,0,0,Height-1,Width-1);
disp_obj(Image, WindowHandle);
}
else
{
CFileDialog dlg(TRUE, NULL,NULL, OFN_HIDEREADONLY,_T("JPEG|*.jpg|All files|*||"));//OFN_ALLOWMULTISELECT打开多文档选项。
if (dlg.DoModal()==IDOK) //如果返回为确定,获得选择的文件名
{
//获取文件路径,读取图像。
CString pathname=dlg.GetPathName( ); //
char* Filename = pathname.GetBuffer(pathname.GetLength()+1);
read_image(&Image,Filename);
get_image_pointer1(Image, &Pointer, &Type, &Width, &Height);
set_part(WindowHandle,0,0,Height-1,Width-1);
disp_obj(Image, WindowHandle);
}
}
}
问题一:通过dlg.GetPathName( )获得的文件路径是CString类型,而Halcon中的read_image需要的类型为HTuple,而这两种数据结构之间似乎不能进行类型转换。
解决办法:由于对read_image不熟悉,不知道它可以使用char *类型的传入参数。因此只要把CString转换为char*类型作为传入参数。
问题二,由dlg.GetPathName( )读取的路径类似下列 "C:\test.jpg",而Halcon需要的路径却是类似"C:/test.jpg"。如果使用的话,还需要进行一次转换。
解决办法:将CString类型装换为char*类型后,似乎没有这个问题了。
参考资料: