返回列表 发新帖我要提问本帖赏金: 40.00元(功能说明)

[单片机芯片] 一种图像数据格式转换的方法

[复制链接]
3256|15
 楼主| 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 界面效果
进行数据格式转换处理的程序如下:
  1. #include "tb.h"
  2. #include "pwm.h"
  3. #include "rtca.h"
  4. #include "adc.h"
  5. #include "dht.h"
  6. #include "kz.h"
  7. #include "sz.h"
  8. #include "tft.h"
  9. void dat_change(void)
  10. {
  11.     unsigned int i,j,k,n,x=50,y=50;
  12.     unsigned int da=0,u,p=0;
  13.     while(p<8)
  14.     {
  15.     k=0;
  16.     n=p;
  17.     for(i=0;i<50;i++)
  18.     {
  19.       for(j=0;j<50;j++)
  20.       {
  21.          if(n==0) da=gImage_tb[k*2];
  22.          if(n==1) da=gImage_pwm[k*2];
  23.          if(n==2) da=gImage_rtc[k*2];
  24.          if(n==3) da=gImage_adc[k*2];
  25.          if(n==4) da=gImage_dht[k*2];
  26.          if(n==5) da=gImage_kz[k*2];
  27.          if(n==6) da=gImage_sz[k*2];
  28.          if(n==7) da=gImage_tft[k*2];
  29.          USART_SendData(USART3, da);
  30.          while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
  31.          u=da<<8;
  32.          if(n==0) da=gImage_tb[k*2];
  33.          if(n==1) da=gImage_pwm[k*2+1];
  34.          if(n==2) da=gImage_rtc[k*2+1];
  35.          if(n==3) da=gImage_adc[k*2+1];
  36.          if(n==4) da=gImage_dht[k*2+1];
  37.          if(n==5) da=gImage_kz[k*2+1];
  38.          if(n==6) da=gImage_sz[k*2+1];
  39.          if(n==7) da=gImage_tft[k*2+1];
  40.          USART_SendData(USART3, da);
  41.          while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
  42.          u|=da;
  43.          POINT_COLOR=u;
  44.          LCD_DrawPoint(x-j,y+i);
  45.          k++;
  46.       }
  47.     }
  48.     while(Bit_SET==GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0));
  49.     Delay_Ms(1000);
  50.     p=p+1;
  51.     }
  52. }


由于串口工具软件在存储接收数据时是采用追加的方式,故每接收一次数据就要将生成的文件更改一次名称,以防止把所有的数据写到一个文件中。
为控制处理的节奏,每处理完一个图标,会判别一次按键状态,当所生成的文件被更名后,再触动按键进入下一个图标处理。
当然若有更多的数值文件要处理,可修改变量P的循环值,并在内层的循环中增添更多的分支处理。
若图标的规格有变化,则可以调节变量ij来匹配图像的长宽比例。
另外,该程序的另一个特点是在转换处理的同时,会同步地在显示屏上再现数组所存储的图像。
在生成DAT文件的基础上,若添加头部的参数,则可输出BMP格式的图像文件。
以前进行图像文件的格式转换都是以软件的方式来完成,现在我们又有了一种新方式,在单片机或ARM开发板上,可实现这种转换的逆变换。
由于CH32V307具有U盘读写能力,因此既可以将数组文件存于U盘,又可以把逆变换所生成的文件存放在U盘上,从而免除串口通信及文件生成的过程。


打赏榜单

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

评论

巧用单片机,在图片原文件丢失的情况下实现图片数据的逆转换。  发表于 2023-3-8 12:36
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
这个搞得有点曲折了

不得已呀!也算是一种方法,且适用于特殊的场合需要。
nawu 发表于 2023-4-4 16:49 | 显示全部楼层
用这种方式转换的图片的最大量是多少呢
 楼主| jinglixixi 发表于 2023-4-5 10:32 | 显示全部楼层
nawu 发表于 2023-4-4 16:49
用这种方式转换的图片的最大量是多少呢

320*240*16位色通讯没问题,更高的按需求进行测试。
tpgf 发表于 2023-4-6 08:43 | 显示全部楼层
jinglixixi 发表于 2023-4-5 10:32
320*240*16位色通讯没问题,更高的按需求进行测试。

大小只和通讯速度有关系吗 和存储容量有没有关系呢
 楼主| jinglixixi 发表于 2023-4-6 11:06 | 显示全部楼层
tpgf 发表于 2023-4-6 08:43
大小只和通讯速度有关系吗 和存储容量有没有关系呢

应该是这样,但也会与文件大小及处理有些关系,所用比较保险的是实际测试一下看。
aoyi 发表于 2023-4-6 11:34 | 显示全部楼层
虽然有点曲折 但是也是一种非常不错的思路呀
zljiu 发表于 2023-4-6 13:31 | 显示全部楼层
在特定的需求场合还是非常好用的
gwsan 发表于 2023-4-6 14:03 | 显示全部楼层
这种文件倒腾来去的做法 会不会有点浪费资源啊
tfqi 发表于 2023-4-6 14:29 | 显示全部楼层
这个思路不错 也是一种迂回解决问题的好办法
 楼主| jinglixixi 发表于 2023-4-7 08:41 | 显示全部楼层
tfqi 发表于 2023-4-6 14:29
这个思路不错 也是一种迂回解决问题的好办法

是,就无需在电脑上通过编程来解决了。
Antecer 发表于 2023-7-7 17:27 | 显示全部楼层
我感觉用浏览器的F12随便写写JS也比这快啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部