在Halcon12中,有set_font和set_display_font两个算子,其中set_display_font是本地函数形式,所以最终的实现算子为set_font.
按照不同的系统环境下,使用方法略有不同:
不同的系统下使用的方法不同,原本以为比较简单,直接按照文档的example来设定就行,但是win下的字体比较多,这种方法可行,其他的系统下未必有指定的Font类型,所以我在Linux下一直提示的Font类型错误码碧茄;
再翻一下最新版Halcon20版本的文慧雀档
新版介绍简单了很多,如果只修改字体,直接使用set_system('default_font',Font)设置默认字体就行,这里还进行提示,根据不同的系统,获取支持的字体进行设置,最后给出了比较简洁的example做参考。
根据之前的帮助文档,可以在Qt下实现字体修改
由于在Linux下设置了好几种字体都显示错误,所以直接使用第二种方法,获取Linux支持的字体进行设置。
根据上述方法设定的效果如下
Halcon窗口显示文字字体修改
halcon图像上的文字一直显示在界面上可以set_display_font——设置显示的字体并设置时间。
拓展资料:
函数原型:set_display_font ( : : WindowHandle, Size, Font, Bold, Slant : )
功能:用来设置当前窗口的文本字体属键激灶性,大小、粗体和斜体。
参数:
Size——Windows系统上的字体大小。 如果Size = -1,则使用默认值16。 在Linux系统上,所有值铅衫都乘以1.25,然后映射到[11、14、17、20、25、34]。建议值: [9, 11, 14, 16, 20, 27]。
Font——字体名称。 可以使用’mono’,‘sans’,'serif’或特定的字体名称。 在Windows上,“mono”将被映射到“Courier New字体”,在Linux上将被稿扮映射到“courier字体”,在OS X上将被映射到“Menlo字体”。在Windows和OS X上,“sans”将被映射到“Arial字体”,以及“helvetica字体”在Linux上。 在Windows和OS X上,“serif”将映射到“Times New Roman字体”,并映射到“times字体”在Linux上。默认值“mono”
Bold——如果设置为“true”,则使用粗体。默认值为“true”。
Slant——如果设置为“ true”,则使用倾斜字体。默认值为“true”。
1. 从Halcon到VC++read_image(&Image,"文件名")//读入的为灰度图像
//获取图像指针,注余轿稿意输出变量的类型
char lpcsType[MAX_STRING]
Hlong Pointer,Width, Height
get_image_pointer1(Image, &Pointer, lpcsType, &Width, &Height)
//Halcon与VC++中的图像之间,存在着上下翻转
BYTE * lpByte
BYTE * ImageG
int bytewidth
bytewidth = ((long) Width * 3 + 3 ) / 4 * 4
ImageG = NULL
ImageG = new BYTE[ bytewidth * (long) Height ]
lpByte = (BYTE *) Pointer //注意结合图像像素帆晌存储的类型进行定义
int i,j
for( j = (long)Height-1j>=0j--)
{//(注意tuple中图像竖孝数据的存放和VC中的差别)
for( i = 0i <(long)WidthGrayi++)
{
* (ImageG + j * bytewidth + i * 3 + 0 ) = * lpByte
* (ImageG + j * bytewidth + i * 3 + 1 ) = * lpByte
* (ImageG + j * bytewidth + i * 3 + 2 ) = * lpByte
lpByte++
}
}
BITMAPINFO * RotateBmpInfo
BYTE * bitBuffer
bitBuffer = NULL
bitBuffer = new BYTE[sizeof(BITMAPINFO)]
RotateBmpInfo = (BITMAPINFO *)bitBuffer
RotateBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER)
RotateBmpInfo->bmiHeader.biHeight = Height
RotateBmpInfo->bmiHeader.biWidth = Width
RotateBmpInfo->bmiHeader.biPlanes = 1
RotateBmpInfo->bmiHeader.biBitCount = 24
RotateBmpInfo->bmiHeader.biCompression = BI_RGB
RotateBmpInfo->bmiHeader.biSizeImage = Height * bytewidth
RotateBmpInfo->bmiHeader.biXPelsPerMeter= 0
RotateBmpInfo->bmiHeader.biYPelsPerMeter= 0
RotateBmpInfo->bmiHeader.biClrUsed = 0
RotateBmpInfo->bmiHeader.biClrImportant = 0
CWnd * m_pWnd
m_pWnd = AfxGetApp()->GetMainWnd()
CDC *pDC = m_pWnd->GetDC()
::StretchDIBits(
pDC->GetSafeHdc(),
Width + 10,
Height + 10,
Width,//显示窗口宽度
Height,//显示窗口高度
0,
0,
Width,//图像宽度
Height,//图像高度
ImageG,
RotateBmpInfo,
DIB_RGB_COLORS,
SRCCOPY)
m_pWnd->ReleaseDC(pDC)
delete [] ImageG
delete [] bitBuffer
2. 从VC++到Halcon
unsigned char *Pointer
int width, height
Pointer = new unsigned char[width * height]
int i, j
for (i=0i<heighti++)
{
for (j=0j<widthj++)
{
Pointer[i*width+j] = j % 255
}
}
Hobject Image
gen_image1_extern(&Image, "byte", (HTuple)width, (HTuple)height, (long)Pointer, NULL)
注:
a) gen_image1_extern函数中的变量width,height必须为HTuple类型,Pointer指针为unsigned char类型,输入时转换为long型。
b) width, height必须与Pointer指向的图像数据的长宽一致。
c) Pointer指针在gen_image1_extern函数调用之前分配了内存,之后不要马上释放,否则会出错。应该在确保不再使用Image变量之后再释放。halcon内部会自动释放Image,感觉没有释放Pointer(还需要进一步验证)。
d) 显示图像时,可能存在着图像的上下翻转,可以按照1中的方法,将图像数据翻转后再调用gen_image1_extern,或者使用halcon中的函数mirror_image()进行翻转。
3. 在VC界面中建立图像窗口
Hlong lWWindowID
HTuple WindowHandle
lWWindowID = (Hlong)m_hWnd//要显示图片的控件的句柄
set_window_attr("border_width",0)//设置窗口属性
set_window_attr("background_color","light gray")//设置窗口背景颜色
set_check("~father")
open_window(0,0,m_Width,m_Height,lWWindowID,"visible","",&WindowHandle)//创建窗口
set_check("father")
set_part(WindowHandle,0,0,m_Width-1,m_Height-1)//对窗口上显示图像和区域的一些设置
set_draw(WindowHandle,"margin")
set_colored(WindowHandle,12)
disp_obj(Image,WindowHandle)//显示图像Image(Hobject类型)
4. 从HTuple类型读取数据
//HTuple有一个元素
HTuple aa = 120
double dd = aa[0].D()// dd=120.000
int ii = aa[0].I()//ii=120
long ll = aa[0].L()//ll=120
Hlong hh = aa[0].L()//hh=120
long num = aa.Num()//num =1
aa = "120"//HTuple为字符串时,如果赋值不是字符串,不能调用S()函数
const char *cc
cc = aa[0].S()//cc[0]='1',cc[1]='2',cc[2]='0'
//当aa为多元素的数组时
aa[1] = 230
num = aa.Num()//num =2
ii = aa[1].I()//ii=230 //其他获取数据的方法与上面类似
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)