搜索
bottom↓
回复: 149

STM32的JPEG/JPG解码实现

[复制链接]

出0入0汤圆

发表于 2009-3-22 16:27:55 | 显示全部楼层 |阅读模式
毕业设计要用到JPEG解码,没办法,选题之后就得动手了。加上在公司实习,自己的时间不是很够,只有充分发挥网络的强大搜索功能了。呵呵,在网上找到一篇STM32JPEG解码的文章,于是乎依葫芦画瓢,把他移植了过来。效果还不错,用了SRAM:14Kb左右,我的STM32F103RBT6,还剩下6K,够其他用途了。好了废话不说,看图:

图片1 (原文件名:111.jpg)


图片2 (原文件名:222.jpg)


图片3 (原文件名:333.jpg)


图片4 (原文件名:444.jpg)


图片5 (原文件名:555.jpg)


大片1 (原文件名:IMG_0269.jpg)


大片2 (原文件名:IMG_0270.jpg)


大片3 (原文件名:IMG_0271.jpg)


大片4 (原文件名:IMG_0272.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)

出0入0汤圆

发表于 2009-3-22 16:48:39 | 显示全部楼层
强人。

出0入0汤圆

发表于 2009-3-22 16:53:57 | 显示全部楼层
强悍,学习

出0入0汤圆

发表于 2009-3-22 17:00:48 | 显示全部楼层
那板子做得强....

出0入0汤圆

发表于 2009-3-22 17:02:51 | 显示全部楼层
高人

出0入0汤圆

发表于 2009-3-22 17:05:42 | 显示全部楼层
不错。。支持一下

出0入0汤圆

发表于 2009-3-22 17:11:00 | 显示全部楼层
COOL

出0入0汤圆

发表于 2009-3-22 17:34:04 | 显示全部楼层
顶!

出0入0汤圆

发表于 2009-3-22 17:39:07 | 显示全部楼层
强悍,楼主好焊功!

出0入0汤圆

发表于 2009-3-22 18:31:17 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2009-3-22 19:05:10 | 显示全部楼层
不错,不知这速度怎么样

出0入0汤圆

发表于 2009-3-22 19:18:21 | 显示全部楼层
期待完善的版本

出0入0汤圆

 楼主| 发表于 2009-3-22 19:19:02 | 显示全部楼层
【11楼】 wenxusun:320*240大小24bit的图像解码大概要2s中 KEIL仿真是:1.949s。

出0入0汤圆

 楼主| 发表于 2009-3-22 19:48:59 | 显示全部楼层
【14楼】 wonderboy:是的,就是这块板子,呵呵。

出0入0汤圆

发表于 2009-3-22 20:45:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-22 20:54:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-22 21:24:22 | 显示全部楼层
高人呀!

出10入210汤圆

发表于 2009-3-23 01:42:52 | 显示全部楼层
好啊!

出0入0汤圆

发表于 2009-3-23 10:17:17 | 显示全部楼层
mark,佩服。

出0入0汤圆

发表于 2009-3-23 10:32:43 | 显示全部楼层
首先,先恭喜一下LZ,做的还是不错的,很好。

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

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

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

出0入10汤圆

发表于 2009-3-23 11:00:39 | 显示全部楼层
楼上的没看代码乱浇冷水 楼主的代码是真正的JPEG解码(不是所有JPEG都能解)
                        static int Zig_Zag[8][8]={{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才对吧
解码后写屏用了太多的时间 如果改成先设定写屏区间 再写屏 那么每个点的设定坐标 设定写入区间这些命令都可以省掉
可以节省很多的时间

出0入0汤圆

发表于 2009-3-23 11:09:37 | 显示全部楼层
LS的不要乱说话,LZ的代码我早就有了,因为我不满意这个代码,他不是我要的正真的JPG解码方式,解码兼容性太差,所以不能说他是一个JPG的解码。。。。

出0入0汤圆

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

出0入0汤圆

发表于 2009-3-23 12:23:50 | 显示全部楼层
牛,不管参考了多少资源,能做出来就是牛!

出0入0汤圆

发表于 2009-3-24 00:05:57 | 显示全部楼层
demo板做的很好啊

出0入0汤圆

发表于 2009-3-24 00:38:28 | 显示全部楼层
把的算法在VC里验证的时候用的几个图片,很多是你提供的(最后一个是俺老婆,^-^!):

(原文件名:01.jpg.jpg)


(原文件名:04.jpg)


(原文件名:07.jpg)


(原文件名:11.jpg)


(原文件名:77.JPG)

出0入0汤圆

 楼主| 发表于 2009-3-24 11:44:39 | 显示全部楼层
LS,能读JFIF以外的其他类型JPEG图片嘛?我在STM32上不能。但是我有一个在电脑上能读的,看了一下算法和这个差不多,但是利用了电脑里面的一些数据读取函数,不知道是不是这里的问题。楼上验证一下,看看我这个代码在电脑上能读不?

出0入0汤圆

发表于 2009-3-24 12:57:55 | 显示全部楼层
好,你发上来,我也想作的通用一些

出0入0汤圆

发表于 2009-3-24 14:16:31 | 显示全部楼层
Mark.

出0入0汤圆

 楼主| 发表于 2009-3-24 15:52:37 | 显示全部楼层
在电脑上测试是可以打开JFIF以外的JPEG图片的ourdev_427615.rar(文件大小:4.13M) (原文件名:real JPEG解码.rar)

出0入0汤圆

发表于 2009-3-24 16:38:49 | 显示全部楼层
这个程序好像和上面的是一样的,在我电脑上打不开呀,晕

出0入0汤圆

发表于 2009-3-24 16:39:46 | 显示全部楼层

(原文件名:test.jpg)

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

出0入0汤圆

 楼主| 发表于 2009-3-24 16:51:30 | 显示全部楼层
也不能哦,你换过一张其他的看看了,用winhex看看是不是JFIF,再看看能不能打开。

出0入0汤圆

发表于 2009-3-24 16:57:13 | 显示全部楼层
我已经看过了,不是JFIF,所以打不开,所以这个程序也是不支持非JFIF的,其它大部分JPEG都是JFIF的,有上面程序就够了。

出0入0汤圆

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

出0入0汤圆

发表于 2009-3-28 14:54:30 | 显示全部楼层
期待完善的版本

出0入0汤圆

发表于 2009-4-4 17:00:26 | 显示全部楼层
楼主太强了,那么复杂的板子,全手工打造。

出0入0汤圆

发表于 2009-4-21 18:29:58 | 显示全部楼层
老兄,真是无私奉献呀!!!!谢谢!!!

出0入0汤圆

发表于 2009-4-24 18:59:23 | 显示全部楼层
72M的ARM解600*300的图片差不多用了三秒咯,有点慢

出0入0汤圆

发表于 2009-4-25 00:35:11 | 显示全部楼层
看看

出0入0汤圆

发表于 2009-4-25 09:09:09 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-4-25 15:00:36 | 显示全部楼层
高手,记号

出0入0汤圆

发表于 2009-4-26 00:00:55 | 显示全部楼层
进展如何了

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

出0入0汤圆

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

出0入0汤圆

发表于 2009-4-28 20:04:30 | 显示全部楼层
哈哈   我可是 亲眼目睹楼主一步步 实现的哦

出0入0汤圆

发表于 2009-5-8 13:57:49 | 显示全部楼层
很不错的说

出0入0汤圆

发表于 2009-7-24 01:01:02 | 显示全部楼层
我想知道  不同大小的图片 是怎么都完全显示到一个屏上的

出0入0汤圆

 楼主| 发表于 2009-7-24 07:29:06 | 显示全部楼层
【49楼】 xiaoxing :这个就很简单了,只要把它压缩成你屏幕大小就OK 了

出0入4汤圆

发表于 2009-7-24 08:46:28 | 显示全部楼层
楼上的振南,你的论坛呢?登不上去啊

出0入0汤圆

发表于 2009-7-24 08:58:52 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-7-24 11:10:17 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-8-4 15:32:22 | 显示全部楼层
不错LZ很强大

出0入0汤圆

发表于 2009-8-4 16:49:05 | 显示全部楼层
太强了!

出0入0汤圆

发表于 2009-8-5 07:40:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-16 17:28:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-17 12:11:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-18 13:39:21 | 显示全部楼层
关注,

出0入4汤圆

发表于 2009-10-20 05:40:15 | 显示全部楼层
Mark

出0入0汤圆

发表于 2009-10-20 07:58:29 | 显示全部楼层
有兴趣的朋友可以通过porting libjpeg 做一个比较共用的中间件,把底层和上层的接口重新封装一下,方便更好的移植。

出0入0汤圆

发表于 2009-10-20 09:20:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-22 23:26:41 | 显示全部楼层
不错的资料,留待日后用

出0入0汤圆

发表于 2009-10-23 10:42:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-22 15:19:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-22 18:35:12 | 显示全部楼层
牛人。。学习

出0入0汤圆

发表于 2010-1-22 21:24:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-22 21:34:26 | 显示全部楼层
mark

出0入4汤圆

发表于 2010-1-23 00:33:35 | 显示全部楼层
【31楼】 liujun6037 提供的代码用到了fopen函数,这才是通用的。

出0入0汤圆

发表于 2010-1-24 00:14:57 | 显示全部楼层
一定要make

出0入0汤圆

发表于 2010-1-24 14:04:57 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-3-4 16:29:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-5 10:36:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-5 13:48:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-6 14:32:34 | 显示全部楼层
牛人

出0入0汤圆

发表于 2010-3-6 23:43:41 | 显示全部楼层
这里用的也是基于楼主的板子,实现的fat 的sd卡,可以读取txt文件。
STM32 SD卡移植FATFS文件系统成功 http://www.cevx.com/bbs/thread-26830-1-1.html

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

出0入0汤圆

发表于 2010-3-6 23:51:27 | 显示全部楼层
赞一个!

出0入0汤圆

发表于 2010-3-7 21:53:37 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2010-3-12 14:43:44 | 显示全部楼层
MAKE

出0入0汤圆

发表于 2010-4-6 18:32:10 | 显示全部楼层
谢谢楼主分享!!

出0入0汤圆

发表于 2010-4-6 20:47:35 | 显示全部楼层
佩服

出0入0汤圆

发表于 2010-4-6 20:50:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-7 11:41:16 | 显示全部楼层
请问下能否解640*480?

出0入0汤圆

 楼主| 发表于 2010-4-7 12:39:25 | 显示全部楼层
回复【83楼】fengyueduzi
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-4-7 13:42:48 | 显示全部楼层
我用640*480的时候Decode();返回:FUNC_FORMAT_ERROR
我具体调试时是在DecodeElement()里面 if(codelen>16) return FUNC_FORMAT_ERROR;

出0入0汤圆

发表于 2010-4-8 08:58:35 | 显示全部楼层
谁用640*480的试过没?能解出来不?

出0入0汤圆

发表于 2010-4-10 22:08:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-12 20:22:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-13 09:06:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-14 14:15:37 | 显示全部楼层
用了楼主的程序,但提示没有以下三个dos.h,fcntl.h,io.h,用的是IAR Embedded Workbench。本人没系统学过,什么也不懂,因毕业要用,所以不得不学

出0入0汤圆

发表于 2010-4-15 11:39:52 | 显示全部楼层
楼主牛人。顶起来。

出0入0汤圆

发表于 2010-5-8 19:08:04 | 显示全部楼层
记号~~

出0入0汤圆

发表于 2010-5-8 19:44:30 | 显示全部楼层
很好,LZ的单面板做的不错!

出0入0汤圆

发表于 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显示,是否需要开辟一大块内存将整张图片读入,然后再用楼主的方式解码显示?不知楼主这个过程是怎样做的?是否可以给个思路?

出0入0汤圆

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

出0入0汤圆

发表于 2010-5-13 15:37:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-13 17:24:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-13 18:06:06 | 显示全部楼层
mask

出0入4汤圆

发表于 2010-5-14 13:11:19 | 显示全部楼层
我用STM32 控制一个320x240的 TFT屏,需要显示jpg的文件,感觉刷整屏的时候可以很明显的感受到刷屏的过程;
显示bmp文件时刷整屏的时候就很快,感觉不到刷屏的过程。STM32是不是不适合解码jpg文件呢?
不知道LZ的是不是这样呀?

出0入0汤圆

发表于 2010-8-1 10:06:24 | 显示全部楼层
楼主可否能共享一下 sd卡上看jpeg/jpg以及bmp格式的图片的程序  那个程序是先生成好。h文件 再解码

出0入0汤圆

 楼主| 发表于 2010-8-1 11:58:55 | 显示全部楼层
回复【99楼】jjl3
-----------------------------------------------------------------------
JPEG解码,在STM32上,如果比较大的分辨率,肯定是不适合了,但是小的分辨率还是比较快的
比如320*240的图片,可以比较快的解码完成。
回复【100楼】zhiweizhang321
-----------------------------------------------------------------------
sd卡显示图片的源码到处都有,随便一搜就找到了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 14:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表