发新帖本帖赏金 40.00元(功能说明)我要提问
返回列表
[单片机芯片]

一种图像数据格式转换的方法

[复制链接]
784|5
手机看帖
扫描二维码
随时随地手机跟帖
jinglixixi|  楼主 | 2023-3-2 22:24 | 显示全部楼层 |阅读模式
#申请原创#
在使用显示屏进行图片显示时,常将JPG格式的文件转换为BMP文件,或是转换为BIN文件或C语言数组文件。所用的工具则是Image2Lcd之类的软件,见图1所示。
1.jpg
1  软件界面
当然事情也有两面性,有正向的转换就有逆向的转换。
例如在一次参赛制作的设计时就发现,以前准备好的图像原文件找不到,只有残余的或C语言数组文件,
没办法只好进行逆向工程了。
但只找到了一种将HEX文件转换为BIN文件的工具软件,却无法满足使用的要求。
那该如何处理呢?
求人不如求自己,最终还是找到了一种方法。
该方法就是使用CH32V307开发板,由程序读取数组的数据,然后通过串口发送到电脑并存储到文件中加以保存。
从接收数据到存入文件的验证过程见图2至图4所示。
2.jpg
2 接收数据


3.jpg
3 HEX方式显示


4.jpg
4 显示文件内容
以一个50*50像素点的16位色彩的图标为例,它共占用5000字节(50*50*2=5000),其数组文件的内容如图5所示。
5.jpg
5 数组数据

通过串行通讯,所接收到的内容如图6所示,说明接收的字节数与数组中的字节数及内容是一致的。
但需要指出的是,尽管两者看上去相一致,却有着很大的区别。
在数组中所存放的数据是以ASCII码的形式存储的,而接收和存储的数据则是以二进制数的形式来存储的,因此在我们观察时是必须通过WinHex软件来查看的,而无法以常规的文本文件方式来查看。
6.jpg
6 接收内容


7.jpg
7 文件内容
在以转换后,所生成的文件经显示其效果如8所示。
8.jpg
8 再现效果
在图9所示的界面中,共有8个图标需要进行处理。如果在进行数据转换处理时,每次只处理一个文件其效率显然是很低的。为此,可通过程序一次性地完成8个图标的处理。
9.jpg
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的循环值,并在内层的循环中增添更多的分支处理。
若图标的规格有变化,则可以调节变量ij来匹配图像的长宽比例。
另外,该程序的另一个特点是在转换处理的同时,会同步地在显示屏上再现数组所存储的图像。
在生成DAT文件的基础上,若添加头部的参数,则可输出BMP格式的图像文件。
以前进行图像文件的格式转换都是以软件的方式来完成,现在我们又有了一种新方式,在单片机或ARM开发板上,可实现这种转换的逆变换。
由于CH32V307具有U盘读写能力,因此既可以将数组文件存于U盘,又可以把逆变换所生成的文件存放在U盘上,从而免除串口通信及文件生成的过程。


使用特权

评论回复

打赏榜单

21小跑堂 打赏了 40.00 元 2023-03-06
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
21小跑堂 2023-3-8 12:36 回复TA
巧用单片机,在图片原文件丢失的情况下实现图片数据的逆转换。 
nuvotontech128| | 2023-3-8 18:48 | 显示全部楼层
那么麻烦,我有现成的软件。直接还原出原图。

使用特权

评论回复
caigang13| | 2023-3-9 08:26 | 显示全部楼层
这个搞得有点曲折了

使用特权

评论回复
jinglixixi|  楼主 | 2023-3-9 09:16 | 显示全部楼层
本帖最后由 jinglixixi 于 2023-3-9 09:19 编辑
nuvotontech128 发表于 2023-3-8 18:48
那么麻烦,我有现成的软件。直接还原出原图。

那是好事,没有的情况下只好自己想办法啦。能上传一个给大家分享吗?

使用特权

评论回复
jinglixixi|  楼主 | 2023-3-9 09:18 | 显示全部楼层
caigang13 发表于 2023-3-9 08:26
这个搞得有点曲折了

不得已呀!也算是一种方法,且适用于特殊的场合需要。

使用特权

评论回复
发新帖 本帖赏金 40.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则