文档章节

Jpeg图像解码-C语言实现

t
 tigerBin
发布于 2017/06/19 20:21
字数 547
阅读 797
收藏 1
点赞 0
评论 4

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
博文 61
码字总数 16992
作品 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

Android平台图像压缩方案

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

郭孝星 ⋅ 2017/11/27 ⋅ 0

英伟达开源数据增强和数据解码库,解决计算机视觉性能瓶颈

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

深度学习 ⋅ 今天 ⋅ 0

常见图片格式详解(三)---JPEG

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

mmlf ⋅ 03/19 ⋅ 0

通过 Flash 让所有浏览器支持 WebP 格式图像解码

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

小卒过河 ⋅ 2011/09/07 ⋅ 4

几种图片格式的简介

JPEG 是目前最常见的图片格式,它诞生于 1992 年,是一个很古老的格式。它只支持有损压缩,其压缩算法可以精确控制压缩比,以图像质量换得存储空间。由于它太过常见,以至于许多移动设备的 ...

南瓜宝宝 ⋅ 2016/05/30 ⋅ 0

giflib 解码 gif 图片

本文将会介绍怎样用giflib解码gif图片。giflib可以在这里下载。 gif文件格式简单介绍 在解码jpeg图片和png图片的时候我们不需要对jpeg和png文件格式有了解就可以解码了(了解jpeg和png当然更...

红薯 ⋅ 2012/06/19 ⋅ 4

数据压缩实验五 JPEG原理分析及JPEG解码器的调试

一、实验原理 1、JPEG图像压缩标准基本介绍 JPEG 是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。JPEG图像压缩算法能够在提供良好的压缩性能的同...

zgyggy ⋅ 2017/05/23 ⋅ 0

【Java】如何把通过串口传递过来的jpeg图像数据流还原显示成jpeg图像

通过串口摄像头拍到一张JPEG图片,然后通过串口把图片的数据发送到PC机,我已经接收到这些数据。但是怎么还原显示就不明白,希望各位不吝赐教。(其中可能涉及到jpeg图像的压缩与解码 最好用j...

huyoulai ⋅ 2012/05/07 ⋅ 6

【腾讯优测干货分享】使用多张图片做帧动画的性能优化

本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57fc8cea302e4725036142f6 使用多张图片做帧动画的性能优化 背景 QQ群的送礼物功能需要加载几十...

腾讯Bugly ⋅ 2016/10/11 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 17分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 19分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 30分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 31分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 34分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 35分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部