热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ImageSharp源码详解之JPEG编码原理(1)JPEG介绍

最近在看GitHub上的一个很火的项目是:ImageSharp。这是一个纯.netcore的图像处理库,没有使用其他的任何依赖。在看这个项目过程中激发了我对图像文件编码解码的兴趣。

最近在看GitHub上的一个很火的项目是:ImageSharp。这是一个纯.net core的图像处理库,没有使用其他的任何依赖。在看这个项目过程中激发了我对图像文件编码解码的兴趣。于是从最简单的BMP图像开始看,到GIF格式卡了一段时间(主要卡在lzw编码过程和数据块中),到最后的JPEG格式(PNG格式不打算看了),经历了半个月时间才梳理出个大概。趁着这个热乎劲,我想写下关于JPEG格式的系列文章,文章目录暂定如下:

ImageSharp源码详解之JPEG编码原理(1)JPEG介绍

ImageSharp源码详解之JPEG编码原理(2)采样

ImageSharp源码详解之JPEG压缩原理(3)DCT变换

ImageSharp源码详解之JPEG压缩原理(4)量化

ImageSharp源码详解之JPEG压缩原理(5)熵编码

ImageSharp源码详解之JPEG压缩原理(6)C#源码解析及调试技巧

JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写。它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telephone Consultative Committee)与国际标准化组织ISO于1986年联合成立的一个小组,负责制定静态数字图像的编码标准。

小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即JPEG算法。JPEG算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。而用JPEG算法压缩出来的静态图片文件称为JPEG文件,扩展名通常为*.jpg、*.jpe*.jpeg。

JPEG专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。具体如下:

压缩算法:

1有损的离散余弦变换(Discrete Cosine Transform,DCT);

2 无损的预测技术压缩。

数据编码方法:

1哈夫曼编码;

2算术编码;

编码模式:

1基于DCT顺序模式:编/解码通过一次扫描完成;

2基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;

3无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;

4层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。

在我阅读的源码中,我关注的是离散余弦变换、哈夫曼编码、基于DCT顺序模式的编码,这也是JPRG图像常用的技术。

整体文件的大致结构如下:

SOI(0xFFD8)

APP0(0xFFE0)

[APPn(0xFFEn)]可选

DQT(0xFFDB)

SOF0(0xFFC0)

DHT(0xFFC4)

SOS(0xFFDA)

压缩数据

EOI(0xFFD9)

我们解码的时候大致都是按照上面顺序进行解码,关于上面这些标记,大家可以从文章结尾参考资料中看到他们的详细信息,这里我不对这些标记展开描述,在后面用到的时候会提到。

2.JPEG压缩的大致过程

2.1 编码

对于一副图像,编码器首先需要填充这个图像的一些头信息,量化表,霍夫曼表。我们可以看ImageSharp中JpegEncoderCore这个类里面的的Encode方法如下:

 1            ...
 2            // Write the Start Of Image marker.
 3             this.WriteApplicationHeader(metadata);
 4             // Write Exif and ICC profiles
 5             this.WriteProfiles(metadata);
 6             // Write the quantization tables.
 7             this.WriteDefineQuantizationTables();
 8             // Write the image dimensions.
 9             this.WriteStartOfFrame(image.Width, image.Height, componentCount);
10             // Write the Huffman tables.
11             this.WriteDefineHuffmanTables(componentCount);
12             // Write the image data.
13             this.WriteStartOfScan(image);
14             // Write the End Of Image marker.
15             this.buffer[0] = JpegConstants.Markers.XFF;
16             this.buffer[1] = JpegConstants.Markers.EOI;
17             stream.Write(this.buffer, 0, 2);
18             stream.Flush();
19         }           
View Code
推荐阅读
  • 实现方式1、首先设置一个Qt下的一个窗口基类;2、窗口基类继承自一个重写的QGLWidget类和一个osgViewer::Viewer类3、重新QGLWidget类& ... [详细]
  • 导读:本篇文章编程笔记来给大家介绍有关php怎么遍历对象的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、如何用php将数 ... [详细]
  • 绑定完成的汗青绑定的基础是propertyChange事宜。怎样得知viewModel成员值的转变一直是开辟MVVM框架的主要题目。主流框架的处置惩罚有一下三大类:别的开辟一套AP ... [详细]
  • Hadoop源码学习笔记(4)——Socket到RPC调用Hadoop是一个分布式程序,分布在多台机器上运行,事必会涉及到网络编程。那这里如何让网络编程变得简单、透明的呢 ... [详细]
  • 1.1.1InputStreampublicabstractclassInputStreamimplementsCloseableInputStreamm继承接口Closeable ... [详细]
  • 与ninject的循环依赖我试图弄清楚如何用ninject绑定这样的东西的正确方法。interfaceIMainService{voidDoStuff();}interfaceIO ... [详细]
  • 在做linux下面的网络编程时写了如下一段程序[cpp:showcolumns]viewplaincopy102030405060708090100110120130140150& ... [详细]
  • 在项目开发中我们经常会遇到应用突然崩溃的问题,如果AndroidStudio上有Log日志,我们能很快找到Bug并解决,但很多情况下,我们的手机并没有连接AndroidStudio ... [详细]
  • 用FileStream,是没办法下载指定文件的,不管你怎么写,都是浪费力气,最后下载的是整个html页面,包括背景,按钮,查询框,图片,虽然还是xsl格式。而且关闭文档,会弹出是否保存当前修改,如果保 ... [详细]
  • 没有得到任何错误,所有数据似乎都有效.出于某种原因,正在调用与视图相关的方法.我确定了以下内容:getItemCount()是唯一被调用的适配器方法,并返回一个正整数值,(我知道 ... [详细]
  • C#知识点StopWatch计时
    目录简单介绍基本用法结尾简单介绍Stopwatch可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间。一般用来测量代码执行所用的时间或者计算性能数据,在优化代码性能 ... [详细]
  • 1套接字发展史及发展套接字起源于20世纪70年代加利福尼亚大学伯克利分校版本的Unix,即人们所说的BSDUnix。因此,有时人们也把套接字称为“伯克利套接字&rdquo ... [详细]
  • spring,三大, ... [详细]
  • 工作原理_一文理解 Spark 基础概念及工作原理
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了一文理解Spark基础概念及工作原理相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 编程实现QQ表情文件CFC格式
    编程实现QQ表情文件CFC格式背景:最近闲来无事,也应论坛某会员要求,想做个QQ表情下载的站点。本来事情是很简单的,写个小小 ... [详细]
author-avatar
mobiledu2502905727
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有