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) 强人。 强悍,学习 那板子做得强.... 高人 不错。。支持一下 COOL 顶! 强悍,楼主好焊功! 学习学习 不错,不知这速度怎么样 期待完善的版本 【11楼】 wenxusun:320*240大小24bit的图像解码大概要2s中 KEIL仿真是:1.949s。 【14楼】 wonderboy:是的,就是这块板子,呵呵。 mark mark 高人呀! 好啊! mark,佩服。 首先,先恭喜一下LZ,做的还是不错的,很好。
其次,是给你来盆冷水,用软件把JPG文件转成.h的文件,其实并非是真正的JPG解码,其实里面有很多的一部分工作,已经在计算机中完成了,如果把没有处理过的JPG原文件放到SD卡里,从SD卡里读取,并显示到液晶上,这样才算完整的JPG解码!
大家不要拍砖,应为我说的是事实。。。。
LZ的这种JPG解码方式早就有了,在Cortex-M3的内核芯片上完成的,只不过是流明的芯片、、、、、 楼上的没看代码乱浇冷水 楼主的代码是真正的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才对吧
解码后写屏用了太多的时间 如果改成先设定写屏区间 再写屏 那么每个点的设定坐标 设定写入区间这些命令都可以省掉
可以节省很多的时间 LS的不要乱说话,LZ的代码我早就有了,因为我不满意这个代码,他不是我要的正真的JPG解码方式,解码兼容性太差,所以不能说他是一个JPG的解码。。。。 【22楼】 luckroll 康锦海:刚写,没多弄,只要实现了功能,优化慢慢来。呵呵。。。
【23楼】 _yu-ming:是真正的JPEG解码,不过只支持JFIF的罢了,要转换为数组的原因是因为我都是存在flash里面的,没有放存储介质,你用WINHEX分析一幅图片的数据和用转换软件得到的数组就知道了,这两个是一样的。 牛,不管参考了多少资源,能做出来就是牛! demo板做的很好啊 把的算法在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) LS,能读JFIF以外的其他类型JPEG图片嘛?我在STM32上不能。但是我有一个在电脑上能读的,看了一下算法和这个差不多,但是利用了电脑里面的一些数据读取函数,不知道是不是这里的问题。楼上验证一下,看看我这个代码在电脑上能读不? 好,你发上来,我也想作的通用一些 Mark. 在电脑上测试是可以打开JFIF以外的JPEG图片的ourdev_427615.rar(文件大小:4.13M) (原文件名:real JPEG解码.rar) 这个程序好像和上面的是一样的,在我电脑上打不开呀,晕 http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427637.jpg
(原文件名:test.jpg)
这是我的JPEG图片,看看你电脑上能不能打开 也不能哦,你换过一张其他的看看了,用winhex看看是不是JFIF,再看看能不能打开。 我已经看过了,不是JFIF,所以打不开,所以这个程序也是不支持非JFIF的,其它大部分JPEG都是JFIF的,有上面程序就够了。 我发现了,代码好像是一样的,我的相机照的相片也可以正常显示了,娃哈哈。。。
先前不能是因为我把它导出为240*320大小的图片,这样属性变了,就显示不了了,但是原始图像是可以显示的,只要不用截图软件截图就好,导出的图片要经过windows画图工具转换一下才好的。 期待完善的版本 楼主太强了,那么复杂的板子,全手工打造。 老兄,真是无私奉献呀!!!!谢谢!!! 72M的ARM解600*300的图片差不多用了三秒咯,有点慢 看看 记号 高手,记号 进展如何了
可以读哪几个版本的JPG图片了? 现在已经可以在SD卡上看JPEG/JPG以及BMP格式的图片了.一般没问题,我的A710IS直拍的照片不经过任何处理也可以正常显示了.就是2.4寸的TFT小了点,效果不太好(图像压缩严重).jpeg部分还是原来代码,没怎么改.只是优化了一下,SRAM缩减优化后,消耗SRAM:12288BYTE就可以正常显示图片了.加入了BMP部分的支持,BMP支持16/24/32位的,都可以流畅播放. 哈哈 我可是 亲眼目睹楼主一步步 实现的哦 很不错的说 我想知道不同大小的图片 是怎么都完全显示到一个屏上的 【49楼】 xiaoxing :这个就很简单了,只要把它压缩成你屏幕大小就OK 了 楼上的振南,你的论坛呢?登不上去啊 MARK MARK 不错LZ很强大 太强了! mark mark mark 关注, Mark 有兴趣的朋友可以通过porting libjpeg 做一个比较共用的中间件,把底层和上层的接口重新封装一下,方便更好的移植。 mark 不错的资料,留待日后用 mark mark 牛人。。学习 mark mark 【31楼】 liujun6037 提供的代码用到了fopen函数,这才是通用的。 一定要make mark! mark mark mark 牛人 这里用的也是基于楼主的板子,实现的fat 的sd卡,可以读取txt文件。
STM32 SD卡移植FATFS文件系统成功 http://www.cevx.com/bbs/thread-26830-1-1.html
看看能不能结合起来,直接解SD卡里面的jpg:) 赞一个! mark一下 MAKE 谢谢楼主分享!! 佩服 mark 请问下能否解640*480? 回复【83楼】fengyueduzi
-----------------------------------------------------------------------
任意大小的图片都可以的.只要格式正确的话. 我用640*480的时候Decode();返回:FUNC_FORMAT_ERROR
我具体调试时是在DecodeElement()里面 if(codelen>16) return FUNC_FORMAT_ERROR; 谁用640*480的试过没?能解出来不? mark mark mark 用了楼主的程序,但提示没有以下三个dos.h,fcntl.h,io.h,用的是IAR Embedded Workbench。本人没系统学过,什么也不懂,因毕业要用,所以不得不学 楼主牛人。顶起来。 记号~~ 很好,LZ的单面板做的不错! 回复【45楼】liujun6037
现在已经可以在sd卡上看jpeg/jpg以及bmp格式的图片了.一般没问题,我的a710is直拍的照片不经过任何处理也可以正常显示了.就是2.4寸的tft小了点,效果不太好(图像压缩严重).jpeg部分还是原来代码,没怎么改.只是优化了一下,sram缩减优化后,消耗sram:12288byte就可以正常显示图片了.加入了bmp部分的支持,bmp支持16/24/32位的,都可以流畅播放.
-----------------------------------------------------------------------
你好,将JFIF图片存储在FLASH上显示已经实现,考虑了一下从U盘读取JFIF显示,是否需要开辟一大块内存将整张图片读入,然后再用楼主的方式解码显示?不知楼主这个过程是怎样做的?是否可以给个思路? 按照上述思路,已经实现从U盘读取JPG图并显示(没有做JPEG的,FATFS返回FR_INVALID_NAME,查看了一下FATFS源码,原来不支持4位的文件后缀名,故改为JPG后缀名),不过想问楼主,如何实现压缩算法? mark mark mask 我用STM32 控制一个320x240的 TFT屏,需要显示jpg的文件,感觉刷整屏的时候可以很明显的感受到刷屏的过程;
显示bmp文件时刷整屏的时候就很快,感觉不到刷屏的过程。STM32是不是不适合解码jpg文件呢?
不知道LZ的是不是这样呀? 楼主可否能共享一下 sd卡上看jpeg/jpg以及bmp格式的图片的程序那个程序是先生成好。h文件 再解码 回复【99楼】jjl3
-----------------------------------------------------------------------
JPEG解码,在STM32上,如果比较大的分辨率,肯定是不适合了,但是小的分辨率还是比较快的
比如320*240的图片,可以比较快的解码完成。
回复【100楼】zhiweizhang321
-----------------------------------------------------------------------
sd卡显示图片的源码到处都有,随便一搜就找到了。
页:
[1]
2