文档章节

Jpeg图像解码-C语言实现

t
 tigerBin
发布于 2017/06/19 20:21
字数 547
阅读 949
收藏 1

Jpeg图片与Bitmap图片一样分为两部分: 文件头 + 数据部分(压缩)

文件头由各个段构成,详情可参考博文:http://blog.csdn.net/lpt19832003/article/details/1713718

其中哈夫曼表一般是固定的,可以在文件中读取,也可以自己不在文件中读取

1.图像分块

在采用前先将图像分块(8x8),如上图所示,也就是每块包含64个像素点,以24位真彩色为例,那么每个像素就包含 RGB 三个字节

2.颜色空间

Jpeg编码使用的 YCbCr颜色空间,其转换方程如下图

3.采样因子 与 最小编码单元(MCU, Minimum Coded Unit)

采样因子包含 水平采样因子垂直采样因子 , 通常使用的采样因子是 Y : Cr : Cb = 2*2 : 1*1 : 1*1 = 4 : 1 : 1

即每 4 个像素采样 4 个 Y 分量,采样 1 个 Cb 分量, 采样一个 Cr 分量。

假设有一副图像有208个像素,如上图所示,可以分为4块,每块8*8=64个像素(不足的补齐)。对其使用 4 : 1 : 1采样,最后的结果就是产生6个数据块【Y1, Y2, Y3, Y4, Cb1, Cr1】,每块有8*8=64个像素,而用于采样生成这6个数据块的原始图像数据就是 MCU(最小编码单元),也就是说 每个 MCU 包含256个像素

4.离散余弦变换 与 逆离散余弦变换

参考:http://blog.csdn.net/luoweifu/article/details/8214959

5.量化

每个分量 * 对应的系数

6.熵编码

查哈夫曼表,解码。需要注意的是解码得到的是标准哈夫曼编码,需要进行一次转换

/* 获取标准哈夫曼编码的真实值 */
int JpegDecoder::GetRealValue(int length)
{
    int retVal = 0;
    for (int i = 0; i < length; i++)
    {
        retVal = (retVal << 1) + NextBit();
    }

    return (retVal >= pow(2, length -1) ? retVal : retVal - pow(2, length) + 1);
}

 

源码:

https://git.oschina.net/SilentCode/tinyjepgdecoder

运行示例:

没有使用任何加速算法,所以解码一张大图需要大约3秒钟的时间,下图是使用OpenCV库函数 imshow() 来显示解码后的位图数据

下面是原图

© 著作权归作者所有

共有 人打赏支持
t
粉丝 0
博文 62
码字总数 17049
作品 0
武汉
程序员
加载中

评论(4)

你微笑时最美

引用来自“你微笑时最美”的评论

您好,这个程序我跑了之后发现只能对您提供的图片进行解码,而对由画图生成的JPEG图像却不能解码,感觉是因为在您的代码中offset是写死的原因,一些JPEG的图片读进来发现块大小都不对。您那边有这个问题么,或者能提供一个编码器么?

引用来自“tigerBin”的评论

另外,一般由window画图工具生成的 .jpg 图像是可以由这个程序解码的,不过window画图工具在保存为.jpg格式文件时可能会在图像头部添加一个 app1 段,可以用画图工具多转换几次(jpg与bmp)就可以去掉这个段。在Binary Viewer中可以很方便的查看jpg各个段的信息
嗯嗯,最近也有自己写了下;多谢楼主~
t
tigerBin

引用来自“你微笑时最美”的评论

您好,这个程序我跑了之后发现只能对您提供的图片进行解码,而对由画图生成的JPEG图像却不能解码,感觉是因为在您的代码中offset是写死的原因,一些JPEG的图片读进来发现块大小都不对。您那边有这个问题么,或者能提供一个编码器么?
另外,一般由window画图工具生成的 .jpg 图像是可以由这个程序解码的,不过window画图工具在保存为.jpg格式文件时可能会在图像头部添加一个 app1 段,可以用画图工具多转换几次(jpg与bmp)就可以去掉这个段。在Binary Viewer中可以很方便的查看jpg各个段的信息
t
tigerBin

引用来自“你微笑时最美”的评论

您好,这个程序我跑了之后发现只能对您提供的图片进行解码,而对由画图生成的JPEG图像却不能解码,感觉是因为在您的代码中offset是写死的原因,一些JPEG的图片读进来发现块大小都不对。您那边有这个问题么,或者能提供一个编码器么?
是这样的,因为jpeg图像头有很多段,每个段都有其特定的意义,比如取样因子,图像大小,图像信息等,但是由于大部分以 .jpg保存的图像的数据头都是固定的,所以,为了简单,我也就只识别图像的几个段(如果图像头部出现多余的信息,会导致解码出错),我这个程序只是用于分析jpg图片的一般流程用的,你可以使用Binary Viewer这个工具查看图像的二进制数据,来分析图像的各个段对解码的作用。
你微笑时最美
您好,这个程序我跑了之后发现只能对您提供的图片进行解码,而对由画图生成的JPEG图像却不能解码,感觉是因为在您的代码中offset是写死的原因,一些JPEG的图片读进来发现块大小都不对。您那边有这个问题么,或者能提供一个编码器么?
NIOS2随笔——JPEG解码与VGA显示

1. 系统概述 本设计采用NIOS2 32位处理器,通过SPI接口将SD/TF卡中的JPEG图片数据读取到内存中,SD/TF卡的文件系统为FAT32,NIOS2软件实现JPEG解码后,启动framereader和Clocked Video Outpu...

shugenyin
2017/01/08
0
0
Android平台图像压缩方案

关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流。 文章目录 一 质...

郭孝星
2017/11/27
0
0
英伟达开源数据增强和数据解码库,解决计算机视觉性能瓶颈

     新智元编译   来源:NVIDIA   编辑:肖琴   【新智元导读】在CVPR 2018大会上,英伟达开源了数据增强库DALI和数据解码库nvJPEG。   在CVPR 2018大会上,英伟达开源了数据增...

深度学习
06/25
0
0
通过 Flash 让所有浏览器支持 WebP 格式图像解码

感谢读者 zjcqoo 的自爆。 WebP是Google推出的一种图片格式,它基于VP8编码,可对图像大幅压缩。与JPEG相同,WebP也是一种有损压缩,但在画质相同的情况下,WebP格式比JPEG图像小40%。见 Wi...

小卒过河
2011/09/07
2.1K
4
常见图片格式详解(三)---JPEG

JPEG简介 JPEG是一种比较成熟的有损的图像压缩格式,经过JPEG压缩,图像质量会有所损失,但是,人眼不容易分辨出来这种差别。jpeg图像在质量和存储空间得到了一个相对平衡的状态。不过jpeg文...

mmlf
03/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
30分钟前
1
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
0
0
890. Find and Replace Pattern - LeetCode

Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"abc ......

yysue
昨天
0
0
Linux | Redis

写在前面的话 常言道,不作笔记不读书。在下是深有体会啊,所以,跟我一起做下本节的笔记吧,或许多年以后,你一定会感谢今天的你。 安装 在官网的下载页 Redis Download 直接写了在Linux的安...

冯文议
昨天
1
0
NoSQL-memcached

NoSQL介绍 NoSQL叫非关系型数据库。而关系型数据库代表有MySQL。对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很...

ln97
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部