文档章节

JpegDecoder--Jpeg文件解码程序

t
 tigerBin
发布于 2017/07/05 13:08
字数 788
阅读 58
收藏 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
粉丝 1
博文 65
码字总数 17440
作品 0
武汉
程序员
私信 提问
常见图片格式详解(三)---JPEG

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

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

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

深度学习
06/25
0
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
0
PICVideo介绍及正版下载

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

javascriptc
2014/08/25
0
0
几种图片格式的简介

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

南瓜宝宝
2016/05/30
43
0

没有更多内容

加载失败,请刷新页面

加载更多

关于MySQL 通用查询日志和慢查询日志分析

MySQL中的日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志。 1)通用查询日志:记录建立的客户端连接和执行的...

瑞查德-Jack
10分钟前
0
0
Vue组件封装 参数传递和事件传递

参数传递 子组件先定义好接收的参数和事件 <div > {{title}} <div class="row"> <Button icon="md-refresh" @click="refresh()" >刷新</Button> </div>......

Carbenson
15分钟前
0
0
如何在10分钟内设置EOS钱包和帐户?

由于SuperNode超级节点社区建立在EOS之上,我们希望引导我们的社区成员设置EOS钱包和帐户,以便充分参与我们的生态系统。 虽然设置过程可能不如其他区块链系统那么简单,但不要担心。本指南旨...

笔阁
19分钟前
2
0
8.04-Win10非U盘重装系统

注意:最好准备一个你所需版本的秘钥(不能是数字0开头的) 【所需:Win10的ISO镜像、能够解压ISO格式的解压缩工具、最好准备你所需版本的秘钥(不能是数字0开头的)】 1、创建新的文件系统为...

静以修身2025
20分钟前
1
0
Docker的架构与自制镜像的发布

一. docker 是什么 大家都知道虚拟机吧,windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机,虚拟机将物理硬件资源虚拟化,按需分配和使用,虚拟机使用起来...

程序猿拿Q
36分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部