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

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

[复制链接]
1889|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#
在使用显示屏进行图片显示时,常将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的循环值,并在内层的循环中增添更多的分支处理。
若图标的规格有变化,则可以调节变量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
那么麻烦,我有现成的软件。直接还原出原图。

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

使用特权

评论回复
5
jinglixixi|  楼主 | 2023-3-9 09:18 | 只看该作者
caigang13 发表于 2023-3-9 08:26
这个搞得有点曲折了

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

使用特权

评论回复
6
nawu| | 2023-4-4 16:49 | 只看该作者
用这种方式转换的图片的最大量是多少呢

使用特权

评论回复
7
jinglixixi|  楼主 | 2023-4-5 10:32 | 只看该作者
nawu 发表于 2023-4-4 16:49
用这种方式转换的图片的最大量是多少呢

320*240*16位色通讯没问题,更高的按需求进行测试。

使用特权

评论回复
8
tpgf| | 2023-4-6 08:43 | 只看该作者
jinglixixi 发表于 2023-4-5 10:32
320*240*16位色通讯没问题,更高的按需求进行测试。

大小只和通讯速度有关系吗 和存储容量有没有关系呢

使用特权

评论回复
9
jinglixixi|  楼主 | 2023-4-6 11:06 | 只看该作者
tpgf 发表于 2023-4-6 08:43
大小只和通讯速度有关系吗 和存储容量有没有关系呢

应该是这样,但也会与文件大小及处理有些关系,所用比较保险的是实际测试一下看。

使用特权

评论回复
10
aoyi| | 2023-4-6 11:34 | 只看该作者
虽然有点曲折 但是也是一种非常不错的思路呀

使用特权

评论回复
11
zljiu| | 2023-4-6 13:31 | 只看该作者
在特定的需求场合还是非常好用的

使用特权

评论回复
12
gwsan| | 2023-4-6 14:03 | 只看该作者
这种文件倒腾来去的做法 会不会有点浪费资源啊

使用特权

评论回复
13
tfqi| | 2023-4-6 14:29 | 只看该作者
这个思路不错 也是一种迂回解决问题的好办法

使用特权

评论回复
14
jinglixixi|  楼主 | 2023-4-7 08:41 | 只看该作者
tfqi 发表于 2023-4-6 14:29
这个思路不错 也是一种迂回解决问题的好办法

是,就无需在电脑上通过编程来解决了。

使用特权

评论回复
15
Antecer| | 2023-7-7 17:27 | 只看该作者
我感觉用浏览器的F12随便写写JS也比这快啊。

使用特权

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

本版积分规则

451

主题

2747

帖子

38

粉丝