#申请原创#
在使用显示屏进行图片显示时,常将JPG格式的文件转换为BMP文件,或是转换为BIN文件或C语言数组文件。所用的工具则是Image2Lcd之类的软件,见图1所示。
图1 软件界面 当然事情也有两面性,有正向的转换就有逆向的转换。 例如在一次参赛制作的设计时就发现,以前准备好的图像原文件找不到,只有残余的或C语言数组文件, 没办法只好进行逆向工程了。 但只找到了一种将HEX文件转换为BIN文件的工具软件,却无法满足使用的要求。 那该如何处理呢? 求人不如求自己,最终还是找到了一种方法。 该方法就是使用CH32V307开发板,由程序读取数组的数据,然后通过串口发送到电脑并存储到文件中加以保存。 从接收数据到存入文件的验证过程见图2至图4所示。
图2 接收数据
图3 以HEX方式显示
图4 显示文件内容 以一个50*50像素点的16位色彩的图标为例,它共占用5000字节(50*50*2=5000),其数组文件的内容如图5所示。
图5 数组数据
通过串行通讯,所接收到的内容如图6所示,说明接收的字节数与数组中的字节数及内容是一致的。 但需要指出的是,尽管两者看上去相一致,却有着很大的区别。 在数组中所存放的数据是以ASCII码的形式存储的,而接收和存储的数据则是以二进制数的形式来存储的,因此在我们观察时是必须通过WinHex软件来查看的,而无法以常规的文本文件方式来查看。
图6 接收内容
图7 文件内容 在以转换后,所生成的文件经显示其效果如8所示。
图8 再现效果 在图9所示的界面中,共有8个图标需要进行处理。如果在进行数据转换处理时,每次只处理一个文件其效率显然是很低的。为此,可通过程序一次性地完成8个图标的处理。
图9 界面效果 进行数据格式转换处理的程序如下: #include "tb.h"
#include "pwm.h"
#include "rtca.h"
#include "adc.h"
#include "dht.h"
#include "kz.h"
#include "sz.h"
#include "tft.h"
void dat_change(void)
{
unsigned int i,j,k,n,x=50,y=50;
unsigned int da=0,u,p=0;
while(p<8)
{
k=0;
n=p;
for(i=0;i<50;i++)
{
for(j=0;j<50;j++)
{
if(n==0) da=gImage_tb[k*2];
if(n==1) da=gImage_pwm[k*2];
if(n==2) da=gImage_rtc[k*2];
if(n==3) da=gImage_adc[k*2];
if(n==4) da=gImage_dht[k*2];
if(n==5) da=gImage_kz[k*2];
if(n==6) da=gImage_sz[k*2];
if(n==7) da=gImage_tft[k*2];
USART_SendData(USART3, da);
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
u=da<<8;
if(n==0) da=gImage_tb[k*2];
if(n==1) da=gImage_pwm[k*2+1];
if(n==2) da=gImage_rtc[k*2+1];
if(n==3) da=gImage_adc[k*2+1];
if(n==4) da=gImage_dht[k*2+1];
if(n==5) da=gImage_kz[k*2+1];
if(n==6) da=gImage_sz[k*2+1];
if(n==7) da=gImage_tft[k*2+1];
USART_SendData(USART3, da);
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
u|=da;
POINT_COLOR=u;
LCD_DrawPoint(x-j,y+i);
k++;
}
}
while(Bit_SET==GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0));
Delay_Ms(1000);
p=p+1;
}
}
由于串口工具软件在存储接收数据时是采用追加的方式,故每接收一次数据就要将生成的文件更改一次名称,以防止把所有的数据写到一个文件中。 为控制处理的节奏,每处理完一个图标,会判别一次按键状态,当所生成的文件被更名后,再触动按键进入下一个图标处理。 当然若有更多的数值文件要处理,可修改变量P的循环值,并在内层的循环中增添更多的分支处理。 若图标的规格有变化,则可以调节变量i和j来匹配图像的长宽比例。 另外,该程序的另一个特点是在转换处理的同时,会同步地在显示屏上再现数组所存储的图像。 在生成DAT文件的基础上,若添加头部的参数,则可输出BMP格式的图像文件。 以前进行图像文件的格式转换都是以软件的方式来完成,现在我们又有了一种新方式,在单片机或ARM开发板上,可实现这种转换的逆变换。 由于CH32V307具有U盘读写能力,因此既可以将数组文件存于U盘,又可以把逆变换所生成的文件存放在U盘上,从而免除串口通信及文件生成的过程。
|
巧用单片机,在图片原文件丢失的情况下实现图片数据的逆转换。