liujun6037 发表于 2009-3-22 16:27:55

STM32的JPEG/JPG解码实现

毕业设计要用到JPEG解码,没办法,选题之后就得动手了。加上在公司实习,自己的时间不是很够,只有充分发挥网络的强大搜索功能了。呵呵,在网上找到一篇STM32JPEG解码的文章,于是乎依葫芦画瓢,把他移植了过来。效果还不错,用了SRAM:14Kb左右,我的STM32F103RBT6,还剩下6K,够其他用途了。好了废话不说,看图:
http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427149.jpg
图片1 (原文件名:111.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427150.jpg
图片2 (原文件名:222.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427151.jpg
图片3 (原文件名:333.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427152.jpg
图片4 (原文件名:444.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427153.jpg
图片5 (原文件名:555.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427154.jpg
大片1 (原文件名:IMG_0269.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427155.jpg
大片2 (原文件名:IMG_0270.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427156.jpg
大片3 (原文件名:IMG_0271.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427157.jpg
大片4 (原文件名:IMG_0272.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427158.jpg
大片5 (原文件名:IMG_0273.jpg)
   对于JPEG的具体解码过程,我没有去多看了,参考了一些其他人的代码,加上了一些注释,可能有些地方不对,还有,本代码只支持JFIF格式的JPEG/JPG解码,对于其他的不支持,各位有兴趣的可以自己修改,把它完善了,做成一个兼容其他格式的JPEG解码。
源代码:
源代码ourdev_427159.rar(文件大小:756K) (原文件名:JPEG解码实验.rar)
    下面是一个图片数据提取软件,网友超级大苹果写的,用来实验用用还可以,等后面我把FAT32、16搞好了就不用提取数据了,直接在SD卡上读取JPEG格式的文件解码就ok咯,前几天搞了个在STM32上的FATfs移植,是好用,但是不支持长文件名,而且源码读起来很困难,还是放弃用这个了。打算把bozai的借过来用算了,可读性比较大。移植一下应该没问题。下面这个软件只有一个按钮,会打开两次文件,第一次是打开JPEG/JPG文件,第二次是导出的数据,把文件名该为.txt,或.h都可以的,然后按打开,就会自动保存了.
图片数据提取软件ourdev_427162.rar(文件大小:5K) (原文件名:图片数据格式提取软件.rar)
    再附上我前面搜索到的一些JPEG解码资料,方便各位把代码完善.
jpeg解码资料ourdev_427161.rar(文件大小:821K) (原文件名:jpeg格式解码资料.rar)

void_c 发表于 2009-3-22 16:48:39

强人。

_yun_yun_ 发表于 2009-3-22 16:53:57

强悍,学习

aozima 发表于 2009-3-22 17:00:48

那板子做得强....

pinocchio 发表于 2009-3-22 17:02:51

高人

hyz_avr 发表于 2009-3-22 17:05:42

不错。。支持一下

cgbabc 发表于 2009-3-22 17:07:31

lin28 发表于 2009-3-22 17:11:00

COOL

kugel 发表于 2009-3-22 17:34:04

顶!

qzzz 发表于 2009-3-22 17:39:07

强悍,楼主好焊功!

wangguanfu 发表于 2009-3-22 18:31:17

学习学习

wenxusun 发表于 2009-3-22 19:05:10

不错,不知这速度怎么样

robinyuan 发表于 2009-3-22 19:18:21

期待完善的版本

liujun6037 发表于 2009-3-22 19:19:02

【11楼】 wenxusun:320*240大小24bit的图像解码大概要2s中 KEIL仿真是:1.949s。

liujun6037 发表于 2009-3-22 19:48:59

【14楼】 wonderboy:是的,就是这块板子,呵呵。

bigflower 发表于 2009-3-22 20:45:09

mark

tkdr2001 发表于 2009-3-22 20:54:06

mark

cuikai12345 发表于 2009-3-22 21:24:22

高人呀!

rainbow 发表于 2009-3-23 01:42:52

好啊!

cndongj 发表于 2009-3-23 10:17:17

mark,佩服。

_yuming 发表于 2009-3-23 10:32:43

首先,先恭喜一下LZ,做的还是不错的,很好。

其次,是给你来盆冷水,用软件把JPG文件转成.h的文件,其实并非是真正的JPG解码,其实里面有很多的一部分工作,已经在计算机中完成了,如果把没有处理过的JPG原文件放到SD卡里,从SD卡里读取,并显示到液晶上,这样才算完整的JPG解码!

大家不要拍砖,应为我说的是事实。。。。

LZ的这种JPG解码方式早就有了,在Cortex-M3的内核芯片上完成的,只不过是流明的芯片、、、、、

luckroll 发表于 2009-3-23 11:00:39

楼上的没看代码乱浇冷水 楼主的代码是真正的JPEG解码(不是所有JPEG都能解)
                        static int Zig_Zag={{0,1,5,6,14,15,27,28},
                                                    {2,4,7,13,16,26,29,42},
                                                  {3,8,12,17,25,30,41,43},
                                                  {9,11,18,24,37,40,44,53},
                                                  {10,19,23,32,39,45,52,54},
                                                  {20,22,33,38,46,51,55,60},
                                                  {21,34,37,47,50,56,59,61},
                                                  {35,36,48,49,57,58,62,63}
                                               };
上面的中间的37应该是31才对吧
解码后写屏用了太多的时间 如果改成先设定写屏区间 再写屏 那么每个点的设定坐标 设定写入区间这些命令都可以省掉
可以节省很多的时间

_yuming 发表于 2009-3-23 11:09:37

LS的不要乱说话,LZ的代码我早就有了,因为我不满意这个代码,他不是我要的正真的JPG解码方式,解码兼容性太差,所以不能说他是一个JPG的解码。。。。

liujun6037 发表于 2009-3-23 12:19:31

【22楼】 luckroll 康锦海:刚写,没多弄,只要实现了功能,优化慢慢来。呵呵。。。
【23楼】 _yu-ming:是真正的JPEG解码,不过只支持JFIF的罢了,要转换为数组的原因是因为我都是存在flash里面的,没有放存储介质,你用WINHEX分析一幅图片的数据和用转换软件得到的数组就知道了,这两个是一样的。

moen 发表于 2009-3-23 12:23:50

牛,不管参考了多少资源,能做出来就是牛!

sino_design 发表于 2009-3-24 00:05:57

demo板做的很好啊

alphawiw1 发表于 2009-3-24 00:38:28

把的算法在VC里验证的时候用的几个图片,很多是你提供的(最后一个是俺老婆,^-^!):
http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427492.jpg
(原文件名:01.jpg.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427493.jpg
(原文件名:04.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427494.jpg
(原文件名:07.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427495.jpg
(原文件名:11.jpg)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427496.JPG
(原文件名:77.JPG)

liujun6037 发表于 2009-3-24 11:44:39

LS,能读JFIF以外的其他类型JPEG图片嘛?我在STM32上不能。但是我有一个在电脑上能读的,看了一下算法和这个差不多,但是利用了电脑里面的一些数据读取函数,不知道是不是这里的问题。楼上验证一下,看看我这个代码在电脑上能读不?

alphawiw1 发表于 2009-3-24 12:57:55

好,你发上来,我也想作的通用一些

wsl16805 发表于 2009-3-24 14:16:31

Mark.

liujun6037 发表于 2009-3-24 15:52:37

在电脑上测试是可以打开JFIF以外的JPEG图片的ourdev_427615.rar(文件大小:4.13M) (原文件名:real JPEG解码.rar)

alphawiw1 发表于 2009-3-24 16:38:49

这个程序好像和上面的是一样的,在我电脑上打不开呀,晕

alphawiw1 发表于 2009-3-24 16:39:46

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427637.jpg
(原文件名:test.jpg)

这是我的JPEG图片,看看你电脑上能不能打开

liujun6037 发表于 2009-3-24 16:51:30

也不能哦,你换过一张其他的看看了,用winhex看看是不是JFIF,再看看能不能打开。

alphawiw1 发表于 2009-3-24 16:57:13

我已经看过了,不是JFIF,所以打不开,所以这个程序也是不支持非JFIF的,其它大部分JPEG都是JFIF的,有上面程序就够了。

liujun6037 发表于 2009-3-24 21:22:03

我发现了,代码好像是一样的,我的相机照的相片也可以正常显示了,娃哈哈。。。
先前不能是因为我把它导出为240*320大小的图片,这样属性变了,就显示不了了,但是原始图像是可以显示的,只要不用截图软件截图就好,导出的图片要经过windows画图工具转换一下才好的。

yaofang1010 发表于 2009-3-28 14:54:30

期待完善的版本

yinkewang 发表于 2009-4-4 17:00:26

楼主太强了,那么复杂的板子,全手工打造。

herihua2009 发表于 2009-4-21 18:29:58

老兄,真是无私奉献呀!!!!谢谢!!!

chenqianglight 发表于 2009-4-24 18:59:23

72M的ARM解600*300的图片差不多用了三秒咯,有点慢

pb486 发表于 2009-4-25 00:35:11

看看

clever0725 发表于 2009-4-25 09:09:09

记号

antonine 发表于 2009-4-25 15:00:36

高手,记号

robinyuan 发表于 2009-4-26 00:00:55

进展如何了

可以读哪几个版本的JPG图片了?

liujun6037 发表于 2009-4-28 18:50:51

现在已经可以在SD卡上看JPEG/JPG以及BMP格式的图片了.一般没问题,我的A710IS直拍的照片不经过任何处理也可以正常显示了.就是2.4寸的TFT小了点,效果不太好(图像压缩严重).jpeg部分还是原来代码,没怎么改.只是优化了一下,SRAM缩减优化后,消耗SRAM:12288BYTE就可以正常显示图片了.加入了BMP部分的支持,BMP支持16/24/32位的,都可以流畅播放.

hexixiaomao 发表于 2009-4-28 20:04:30

哈哈   我可是 亲眼目睹楼主一步步 实现的哦

fugeone 发表于 2009-5-8 13:57:49

很不错的说

xiaoxing 发表于 2009-7-24 01:01:02

我想知道不同大小的图片 是怎么都完全显示到一个屏上的

liujun6037 发表于 2009-7-24 07:29:06

【49楼】 xiaoxing :这个就很简单了,只要把它压缩成你屏幕大小就OK 了

MoMo_avr 发表于 2009-7-24 08:46:28

楼上的振南,你的论坛呢?登不上去啊

wanyou132 发表于 2009-7-24 08:58:52

MARK

cowboy 发表于 2009-7-24 11:10:17

MARK

mcu_mouse 发表于 2009-8-4 15:32:22

不错LZ很强大

xujian 发表于 2009-8-4 16:49:05

太强了!

sweet1985 发表于 2009-8-5 07:40:40

mark

farmer 发表于 2009-10-16 17:28:01

mark

mystm32 发表于 2009-10-17 12:11:47

mark

2nd090215 发表于 2009-10-18 13:39:21

关注,

MyAVR 发表于 2009-10-20 05:40:15

Mark

hoverlin 发表于 2009-10-20 07:58:29

有兴趣的朋友可以通过porting libjpeg 做一个比较共用的中间件,把底层和上层的接口重新封装一下,方便更好的移植。

grady008 发表于 2009-10-20 09:20:50

mark

waiman 发表于 2009-10-22 23:26:41

不错的资料,留待日后用

zhangxun0712 发表于 2009-10-23 10:42:06

mark

mslmcu 发表于 2010-1-22 15:19:40

mark

niba 发表于 2010-1-22 18:35:12

牛人。。学习

bigflower 发表于 2010-1-22 21:24:50

mark

tear086 发表于 2010-1-22 21:34:26

mark

sunliezhi 发表于 2010-1-23 00:33:35

【31楼】 liujun6037 提供的代码用到了fopen函数,这才是通用的。

tuy0326 发表于 2010-1-24 00:14:57

一定要make

leiyun121 发表于 2010-1-24 14:04:57

mark!

ep1c3 发表于 2010-3-4 16:29:52

mark

Cortex-M8 发表于 2010-3-5 10:36:21

mark

huqingpp 发表于 2010-3-5 13:48:57

mark

yours777 发表于 2010-3-6 14:32:34

牛人

ourstm32 发表于 2010-3-6 23:43:41

这里用的也是基于楼主的板子,实现的fat 的sd卡,可以读取txt文件。
STM32 SD卡移植FATFS文件系统成功 http://www.cevx.com/bbs/thread-26830-1-1.html

看看能不能结合起来,直接解SD卡里面的jpg:)

lijintao 发表于 2010-3-6 23:51:27

赞一个!

youki1234 发表于 2010-3-7 21:53:37

mark一下

whlx622 发表于 2010-3-12 14:43:44

MAKE

fengyueduzi 发表于 2010-4-6 18:32:10

谢谢楼主分享!!

20062673 发表于 2010-4-6 20:47:35

佩服

szwangyan 发表于 2010-4-6 20:50:45

mark

fengyueduzi 发表于 2010-4-7 11:41:16

请问下能否解640*480?

liujun6037 发表于 2010-4-7 12:39:25

回复【83楼】fengyueduzi
-----------------------------------------------------------------------

任意大小的图片都可以的.只要格式正确的话.

fengyueduzi 发表于 2010-4-7 13:42:48

我用640*480的时候Decode();返回:FUNC_FORMAT_ERROR
我具体调试时是在DecodeElement()里面 if(codelen>16) return FUNC_FORMAT_ERROR;

fengyueduzi 发表于 2010-4-8 08:58:35

谁用640*480的试过没?能解出来不?

bigflower 发表于 2010-4-10 22:08:32

mark

James_King 发表于 2010-4-12 20:22:07

mark

cndongj 发表于 2010-4-13 09:06:46

mark

20062673 发表于 2010-4-14 14:15:37

用了楼主的程序,但提示没有以下三个dos.h,fcntl.h,io.h,用的是IAR Embedded Workbench。本人没系统学过,什么也不懂,因毕业要用,所以不得不学

lunqi 发表于 2010-4-15 11:39:52

楼主牛人。顶起来。

zbjzxc 发表于 2010-5-8 19:08:04

记号~~

xixiangfeng 发表于 2010-5-8 19:44:30

很好,LZ的单面板做的不错!

lzllong 发表于 2010-5-12 09:16:23

回复【45楼】liujun6037
现在已经可以在sd卡上看jpeg/jpg以及bmp格式的图片了.一般没问题,我的a710is直拍的照片不经过任何处理也可以正常显示了.就是2.4寸的tft小了点,效果不太好(图像压缩严重).jpeg部分还是原来代码,没怎么改.只是优化了一下,sram缩减优化后,消耗sram:12288byte就可以正常显示图片了.加入了bmp部分的支持,bmp支持16/24/32位的,都可以流畅播放.
-----------------------------------------------------------------------

你好,将JFIF图片存储在FLASH上显示已经实现,考虑了一下从U盘读取JFIF显示,是否需要开辟一大块内存将整张图片读入,然后再用楼主的方式解码显示?不知楼主这个过程是怎样做的?是否可以给个思路?

lzllong 发表于 2010-5-12 14:54:54

按照上述思路,已经实现从U盘读取JPG图并显示(没有做JPEG的,FATFS返回FR_INVALID_NAME,查看了一下FATFS源码,原来不支持4位的文件后缀名,故改为JPG后缀名),不过想问楼主,如何实现压缩算法?

orange2348 发表于 2010-5-13 15:37:21

mark

langren27 发表于 2010-5-13 17:24:37

mark

ap0405209 发表于 2010-5-13 18:06:06

mask

jjl3 发表于 2010-5-14 13:11:19

我用STM32 控制一个320x240的 TFT屏,需要显示jpg的文件,感觉刷整屏的时候可以很明显的感受到刷屏的过程;
显示bmp文件时刷整屏的时候就很快,感觉不到刷屏的过程。STM32是不是不适合解码jpg文件呢?
不知道LZ的是不是这样呀?

zhiweizhang321 发表于 2010-8-1 10:06:24

楼主可否能共享一下 sd卡上看jpeg/jpg以及bmp格式的图片的程序那个程序是先生成好。h文件 再解码

liujun6037 发表于 2010-8-1 11:58:55

回复【99楼】jjl3
-----------------------------------------------------------------------
JPEG解码,在STM32上,如果比较大的分辨率,肯定是不适合了,但是小的分辨率还是比较快的
比如320*240的图片,可以比较快的解码完成。
回复【100楼】zhiweizhang321
-----------------------------------------------------------------------
sd卡显示图片的源码到处都有,随便一搜就找到了。
页: [1] 2
查看完整版本: STM32的JPEG/JPG解码实现