文档章节

JpegDecoder--Jpeg文件解码程序

t
 tigerBin
发布于 2017/07/05 13:08
字数 788
阅读 52
收藏 0
点赞 0
评论 0

Source: http://git.oschina.net/SilentCode/JpegCodecs

性能分析: gprof main.exe > profile.txt

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 13.40      0.13     0.13                             _spin_lite_unlock
 12.37      0.25     0.12                             std::string::compare(std::string const&)
 12.37      0.37     0.12                             _spin_lite_lock
 10.31      0.47     0.10                             __pthread_self_lite
  9.28      0.56     0.09                             std::_Rb_tree<std::string,
  8.25      0.64     0.08                             Transform(int*)
  4.12      0.68     0.04                             std::less<std::string>::operator()
  3.09      0.71     0.03                             std::_Rb_tree<std::string, 
  3.09      0.74     0.03                             bool std::operator< <char, 
  3.09      0.77     0.03                             __fpclassify
  2.06      0.79     0.02                             ConvertClrSpace
  2.06      0.81     0.02                             std::_Select1st
  2.06      0.83     0.02                             std::_Rb_tree_iterator
  2.06      0.85     0.02                             std::_Rb_tree
  2.06      0.87     0.02                             round
  1.03      0.88     0.01        1    10.00    10.00  Encoder(unsigned char*, int, int, int&)
  1.03      0.89     0.01                             SetLastError@4
  1.03      0.90     0.01                             ComputeRealValue(int)
  1.03      0.91     0.01                             UpSample(int*, int*)
  1.03      0.92     0.01                             std::_Rb_tree
  1.03      0.93     0.01                             std::string
  1.03      0.94     0.01                             std::_Rb_tree
  1.03      0.95     0.01                             std::_Rb_tree
  1.03      0.96     0.01                             pthread_getspecific
  1.03      0.97     0.01                             pthread_setspecific
  0.00      0.97     0.00        1     0.00     0.00  SetBitmapInfo(unsigned int, int, int)
  0.00      0.97     0.00        1     0.00     0.00  Write(char const*, unsigned char*, int&)
  0.00      0.97     0.00        1     0.00     0.00  Matrix()

可以看出,解码一张图片大约 1s 钟,而实际用于解码的时间不到 0.5s ,这是因为STL容器里面加入了很多安全与多线程相关的操作,这些额外的开销增加了解码的时间

下面是基于我实现的 tinyMap 解码后的结果:

Source:https://github.com/lzb-cc/JpegCodecs

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 23.73      0.14     0.14    48960     0.00     0.00  JpegDecoder::Transform(int*)
 15.25      0.23     0.09                             round
 13.56      0.31     0.08  2092962     0.00     0.00  tinyMap::find(int)
 10.17      0.37     0.06     8160     0.01     0.01  ConvertClrSpace(unsigned char*, int, int)
  8.47      0.42     0.05  2333318     0.00     0.00  NextBit()
  5.08      0.45     0.03        1    30.00    30.00  Encoder(unsigned char*, int, int, int&)
  5.08      0.48     0.03                             __fpclassify
  3.39      0.50     0.02    48960     0.00     0.00  Dequant(int*, unsigned char*)
  3.39      0.52     0.02    48960     0.00     0.00  UnZigZag(int*, int*)
  3.39      0.54     0.02    16320     0.00     0.00  UpSample(int*, int*)
  1.69      0.55     0.01  1776506     0.00     0.00  tinyStl::tinyMap::find(int, int)
  1.69      0.56     0.01   316456     0.00     0.00  FindKeyValue(tinyStl::tinyMap&)
  1.69      0.57     0.01   267496     0.00     0.00  ComputeRealValue(int)
  1.69      0.58     0.01    48960     0.00     0.00  DecoderBlock
  1.69      0.59     0.01                             _spin_lite_lock
  0.00      0.59     0.00  1776506     0.00     0.00  tinyStl::tinyMap::end()
  0.00      0.59     0.00   316456     0.00     0.00  tinyStl::tinyMap::operator[](int)
  0.00      0.59     0.00    26214     0.00     0.00  tinyStl::MapNode::Less(tinyStl::MapNode*)
  0.00      0.59     0.00     8160     0.00     0.04  JpegCodec::JpegDecoder::DecoderMCU()
  0.00      0.59     0.00     8160     0.00     0.00  FillYCbCr()
  0.00      0.59     0.00      680     0.00     0.00  GrandParent(tinyStl::RBNode*)
  0.00      0.59     0.00      348     0.00     0.00  RBNode()
  0.00      0.59     0.00      348     0.00     0.00  Check1(tinyStl::RBNode*)
  0.00      0.59     0.00      348     0.00     0.00  Insert(tinyStl::RBNode*)
  0.00      0.59     0.00      348     0.00     0.00  insert(int, int, int)
  0.00      0.59     0.00      344     0.00     0.00  Check2(tinyStl::RBNode*)
  0.00      0.59     0.00      344     0.00     0.00  AddToTree(tinyStl::RBNode*, tinyStl::RBNode*)
  0.00      0.59     0.00      340     0.00     0.00  RBTree::Uncle(tinyStl::RBNode*)
  0.00      0.59     0.00      340     0.00     0.00  Check3(tinyStl::RBNode*)
  0.00      0.59     0.00      340     0.00     0.00  Check4(tinyStl::RBNode*)
  0.00      0.59     0.00        4     0.00     0.00  RBTree()
  0.00      0.59     0.00        4     0.00     0.00  tinyMap()
  0.00      0.59     0.00        4     0.00     0.00  ReBuildTable(int, tinyStl::tinyMap&)
  0.00      0.59     0.00        3     0.00     0.00  MarkIndex(unsigned char)
  0.00      0.59     0.00        1     0.00     0.00  SetBitmapInfo(unsigned int, int, int)
  0.00      0.59     0.00        1     0.00     0.00  Write(char const*, unsigned char*, int&)
  0.00      0.59     0.00        1     0.00     0.00  ComputeDHT()
  0.00      0.59     0.00        1     0.00     0.00  ReadImageSize()
  0.00      0.59     0.00        1     0.00     0.00  ToStartOfData()
  0.00      0.59     0.00        1     0.00     0.00  ReadQuantTable()
  0.00      0.59     0.00        1     0.00   430.00  Decoder(JpegCodec::Matrix&)
  0.00      0.59     0.00        1     0.00     0.00  JpegDecoder(char const*)
  0.00      0.59     0.00        1     0.00     0.00  ~JpegDecoder()
  0.00      0.59     0.00        1     0.00     0.00  Create(int, int, int)
  0.00      0.59     0.00        1     0.00     0.00  Matrix::Matrix()

与使用STL相比,性能有了明显的提升

测试代码:

// main.cpp
#include <stdio.h>
#include "JpegDecoder.h"
#include "BmpEncoder.h"

using namespace JpegCodec;

int main(int argc, char *argv[])
{
	if (argc < 3)
	{
		printf("Usage: main input.jpg out.bmp\n");
		return 0;
	}
	/* 解码 Jpeg 文件 */
	JpegDecoder decoder(argv[1]);
	Matrix mat;
    	decoder.Decoder(mat);

	/* 保存为 Bitmap 格式图像 */
	int size;
	unsigned char *bitmap = Encoder(mat.data, mat.rows, mat.cols, size);
	Write(argv[2], bitmap, size);
	return 0;
}

 

© 著作权归作者所有

共有 人打赏支持
t
粉丝 0
博文 61
码字总数 16992
作品 0
武汉
程序员
常见图片格式详解(三)---JPEG

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

mmlf ⋅ 03/19 ⋅ 0

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

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

zgyggy ⋅ 2017/05/23 ⋅ 0

NIOS2随笔——JPEG解码与VGA显示

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

shugenyin ⋅ 2017/01/08 ⋅ 0

PICVideo介绍及正版下载

PICVideo是完美的唯一可同时支持64位和32位的MJPEG(动态JPEG)视频编解码器。 Pegasus Imaging提供了业界里最快速和最高品质的影像压缩与解压缩技术。Pegasus优化了动态JPEG、无损失的JPEG以...

javascriptc ⋅ 2014/08/25 ⋅ 0

PICVideo介绍及正版下载

PICVideo是完美的唯一可同时支持64位和32位的MJPEG(动态JPEG)视频编解码器。 Pegasus Imaging提供了业界里最快速和最高品质的影像压缩与解压缩技术。Pegasus优化了动态JPEG、无损失的JPEG以...

javascript1 ⋅ 2014/08/25 ⋅ 0

几种图片格式的简介

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

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

从零开始手敲次世代游戏引擎(JPEG特别篇)-2

接从零开始手敲次世代游戏引擎(JPEG特别篇)-1。 (首先说一下,这篇会非常难看。但是如果动手去做了,会对各项能力有极大的提高) 我们现在有了核心的算法库,接下来就是实际读取JPEG文件并...

陈文礼 ⋅ 2017/12/09 ⋅ 0

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

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

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

针对opencv imdecode 解码性能低的解决方案--libjpeg-turbo

opencv 对JPEG的解码,其内部实质上是基于第三方库libjpeg进行解码的。但是libjpeg本身的性能并不是很快。经测试对一张2336x4160分辨率的jpg文件进行解码,在android 环境下使用opencv imde...

二胡艺 ⋅ 2015/07/29 ⋅ 0

WebP Codec for Windows发布,可看WebP图片

感谢读者 xslidian 的爆料和翻译。 Windows WebP 编解码组件(WebP Codec for Windows)是一款使用 libvpx 库构建的编解码组件。它整合了 Windows 图像处理组件 (WIC) 所定义的界面,为 Wind...

老枪 ⋅ 2011/03/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 52分钟前 ⋅ 0

Spring mvc DispatchServlet 实现原理

在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherSer...

轨迹_ ⋅ 今天 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 今天 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 今天 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部