VC实现将图片转换为数组

VC实现将图片转换为数组

  上个学期,我尝试过使用不带字库的LCD12864模块。这种模块能显示128x64像素的内容,显示面积相当大,对学习单片机并用来开发界面可是很有吸引力的哦。

  于是,我向个学长借了个过来用。开发平台是430。之所以用它,是因为它内部RAM大,还有相当快的速度,是51所不及的。再加上那块430板,是一个即将毕业的研究生画的,板上资源相当丰富,又小巧,我很喜欢。

  对LCD12864模块来说,程序时序上没有什么大问题,只要按着数据手册来,没有什么太大的难度。当时开始弄时,还是有点不自信,但这样的东西,重要的就是是否有胆量参与进去,做一做。最终还是会有收获的。430程序有机会再分享,这里不展开。

  主要是PC机上的图片转换工具。因为学习VC有一个学期左右了,很想挑战下,把一张图片转换成LCD12864所能识别的数据类型。先介绍下LCD12864内部RAM的结构。屏幕上的128x64个像素分为两个屏,左屏和右屏,分别是64x64像素的区域。对每一屏来说,每纵向的8个点便是一个字节的数据。字节中每一bit的值代表该位的亮与灭(因为使用的是无灰度级的模块)。这样,整个屏的数据就可以用两个大的数组来表示,每一数组得是512个字节。

  LCD12864是已经能显示出来,但是只能显示一些简单的矩形。如何才能把图片转换成数组,便是我思考的问题。于是,就用VC实现了一个小程序。

  程序中用了一个类,是直接借鉴《精通Visual C++.NET图像处理编程》里的CDib类,是一个方便的能对图像读写操作的类。用它主要是为了使用的一个佛罗依德抖动算法,该算法可以将一个图像(彩色或灰度,灰度效果更好)转为只用黑白点表示,较黑的地方黑点越密,较浅色的地方,黑点越稀松。这样,得到的图像就可以按像素点转化为相应的字节数据,保存出来即可。

  下面的程序段是保存像素的部分:

 // For the left screen.
 for(k = 0; k < 8; k++){   // LCD page
  for (j = 0; j < 64; j ++){ // LCD coloum
   for(i = 0; i < 8; i++){ // LCD row
    if(m_desDC.GetPixel(j, i + k * 8) == RGB(0, 0, 0)){
     ucCS1[k][j] |= 0x01 << i;
    }
   }
  }
 }

  采用移位的方式,将8个点的信息存为一个字节。

  程序最终界面如下,还有生成的数据文件。

  程序目前还有些小bug,比如打开图片后,当程序界面重绘时就显示不出图片。试过很多办法,比如在MFC的OnPaint函数里回入绘图时,程序会变得很慢,它会一直在重绘。或是其它的比如active等类型的函数里加过,也没有。有机会再完善点吧,画图怎么说都是视窗系统的优势啊,掌握好画图也是项不错的技术。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值