telecom1633 发表于 2011-12-28 15:15:03

教你如何用QT提取字模

最近在搞LCD点陈显示,对于字模的生成与制做只能依靠第三方软件。这样有一个很大的不方便,软件是别人写的不可能完全满足自己的要球。并且要要求直接下载到显示屏上,上网搜了老半天,没搜到一个。没办法自力更生吧,发扬下优良传统吧。老规举,先是上网搜了一番。对了忘了说下,以前我学过一段时间的QT,希望用QT来完成。经过网上的一番苦苦搜索,也就搜到了几扁,总结一下基本就两点思路:一种是直接读取字库文件,这要求对这库文件的存储格式要有一定的了解,现在也没什么耐心去看这些东西。另一种是能过在IMAGE上绘单通道的图,然后提取位索引就行了。以下是大致思路和伪码。

对于QT绘画不想说的太多,学过的人应该都知道,没学过自己学学,对于QT绘画首先要重载重绘函数:paintEvent();QT绘可以直接在Widget绘制,还可以进行双绘冲绘制(先绘制在绘图设备上,如QImage,QPixmap等上然后再一次性的绘到相应的Widget去),本次就是先在QImage上绘,然后再进行位INDEX的读取,这个读取个人有个人的方法,要求也不一样,有的要倒序正取,有的要横向正取。就实际需求而变吧。以下是伪码了:



      一、定义QImage

            QImage image(32,32, QImage::Format_MonoLSB);

                  这里定义了一个32*32点的QImage,若是要求16*16点的也得定义成32*32点的,因为计算计是64位的一行最少得4个字节

            到时候只提取自己需要的 那个16*16点就行了。

                *******补充一点 Format_MononLSB是单通道的图像格式,一位保存一个PIX。QImage中还有一个相似的是   

            Format_Monon ,两都的区别在于一个是正充排列一个是倒序排列的。

      二、定义自己的绘图设备

            QPainter painter (&image);

            看清楚了是在image上绘的哦,而不是在this上会的,这就是双缓冲绘图哦。

            QRgb backColor = qRgb(255,255,255);定义自己的颜色            

image.fill(backColor); 填充
三、开始绘制
painter.drawText (image.rect(), "袁");
四、好啦现在可以按自己的要求提取自己的字模啦
哈哈大家看的有点累了吧,下面让大家看下成果吧,以下是我用以上绘制字模截图。


http://cache.amobbs.com/bbs_upload782111/files_49/ourdev_708429IPFS9J.jpg
(原文件名:ggggggggggggg.jpg)



以下是代码:
for(i=0;i<16;i++) {unsigned char *lineByte=image.scanLine(i);x=100;for(j=0;j<2;j++){unsigned char tp;tp=lineByte;for(z=0;z<8;z++){if(tp&0x01){paint.setPen(penR);paint.drawText(x,y,"1");x+=10;}else{paint.setPen(penB);paint.drawText(x,y,"0");x+=10;}tp>>=1;}}y+=10;}

这里只是给个大致的思路,兴趣的朋友可联系我一起探讨或留言

Q28182900 发表于 2013-1-14 10:27:06

westra 发表于 2014-1-21 15:33:55

这也忒高端了吧
页: [1]
查看完整版本: 教你如何用QT提取字模