TJpgDec使用说明
TJpgDec模块应用说明
怎么使用
首先,你应该构建和运行如下所示示例程序。这是一个典型的使用TJpgDec模块,它有助于调试和缩小问题。
解码会话分为两个阶段。第一阶段是分析JPEG图像,第二阶段是解码。
- 初始化输入流。(例如:打开一个文件)
- 分配JPEG解码对象和工作区域。
- 调用
jd_prepare取分析和准备压缩的JPEG图像。 - 使用解码对象中的图像信息初始化输出设备。
- 调用
jd_decomp解码JPEG图像。
系统结构

示例
/*------------------------------------------------*/
/* TJpgDec Quick Evaluation Program for PCs */
/*------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include "tjpgd.h"
/* 用户定义设备标识 */
typedef struct {
FILE *fp; /* 用于输入函数的文件指针 */
BYTE *fbuf; /* 用于输出函数的帧缓冲区的指针 */
UINT wfbuf; /* 帧缓冲区的图像宽度[像素] */
} IODEV;
/*------------------------------*/
/* 用户定义input funciton */
/*------------------------------*/
UINT in_func (JDEC* jd, BYTE* buff, UINT nbyte)
{
IODEV *dev = (IODEV*)jd->device; /* Device identifier for the session (5th argument of jd_prepare function) */
if (buff) {
/* 从输入流读取一字节 */
return (UINT)fread(buff, 1, nbyte, dev->fp);
} else {
/* 从输入流移除一字节 */
return fseek(dev->fp, nbyte, SEEK_CUR) ? 0 : nbyte;
}
}
/*------------------------------*/
/* 用户定义output funciton */
/*------------------------------*/
UINT out_func (JDEC* jd, void* bitmap, JRECT* rect)
{
IODEV *dev = (IODEV*)jd->device;
BYTE *src, *dst;
UINT y, bws, bwd;
/* 输出进度 */
if (rect->left == 0) {
printf("\r%lu%%", (rect->top << jd->scale) * 100UL / jd->height);
}
/* 拷贝解码的RGB矩形范围到帧缓冲区(假设RGB888配置) */
src = (BYTE*)bitmap;
dst = dev->fbuf + 3 * (rect->top * dev->wfbuf + rect->left); /* 目标矩形的左上 */
bws = 3 * (rect->right - rect->left + 1); /* 源矩形的宽度[字节] */
bwd = 3 * dev->wfbuf; /* 帧缓冲区宽度[字节] */
for (y = rect->top; y <= rect->bottom; y++) {
memcpy(dst, src, bws); /* 拷贝一行 */
src += bws; dst += bwd; /* 定位下一行 */
}
return 1; /* 继续解码 */
}
/*------------------------------*/
/* 主程序 */
/*------------------------------*/
int main (int argc, char* argv[])
{
void *work; /* 指向解码工作区域 */
JDEC jdec; /* 解码对象 */
JRESULT res; /* TJpgDec API的返回值 */
IODEV devid; /* 用户定义设备标识 */
/* 打开一个JPEG文件 */
if (argc < 2) return -1;
devid.fp = fopen(argv[1], "rb");
if (!devid.fp) return -1;
/* 分配一个用于TJpgDec的工作区域 */
work = malloc(3100);
/* 准备解码 */
res = jd_prepare(&jdec, in_func, work, 3100, &devid);
if (res == JDR_OK) {
/* 准备好解码。图像信息有效 */
printf("Image dimensions: %u by %u. %u bytes used.\n", jdec.width, jdec.height, 3100 - jdec.sz_pool);
devid.fbuf = malloc(3 * jdec.width * jdec.height); /* 输出图像的帧缓冲区(假设RGB888配置) */
devid.wfbuf = jdec.width;
res = jd_decomp(&jdec, out_func, 0); /* 开始1/1缩放解码 */
if (res == JDR_OK) {
/* 解码成功。你在这里已经解码图像到帧缓冲区 */
printf("\rOK \n");
} else {
printf("Failed to decompress: rc=%d\n", res);
}
free(devid.fbuf); /* 释放帧缓冲区 */
} else {
printf("Failed to prepare: rc=%d\n", res);
}
free(work); /* 释放工作区域 */
fclose(devid.fp); /* 关闭JPEG文件 */
return res;
}
限制
- JPEG标准:仅基线。渐进和无损JPEG格式不支持。
- 图像大小:最大
65520 x 65520像素。 - 颜色空间:仅
YCbCr三通道。灰度图像不支持。 - 采样因子:
4:4:4、4:2:2或4:2:0。
内存使用
这是一些平台在默认配置下的内存占用。编译优化的代码大小。
| AVR | PIC24 | CM0 | IA-32 |
|---|---|---|---|
| 编译器 | GCC | C30 | GCC |
| 程序大小 | 9422 | 6544 | 4536 |
至于工作区,TJpgDec至多需要3100字节用于JPEG图像。这完全取决于什么样的参数被用来创建JPEG图像。3100字节是在默认输入缓存(JD_SZBUF == 512)下的最大内存需求,并随JD_SZBUF变化。JD_SZBUF定义每次从输入流中读取多少字节。TJpgDec对齐每个读请求缓冲区大小,512, 1024, 2048... 字节是从存储设备读取的理想大小。
关于TJpgDec许可
这是一份包含在源代码TJpgDec许可文件。
/*----------------------------------------------------------------------------/
/ TJpgDec - Tiny JPEG Decompressor R0.01 (C)ChaN, 2011
/-----------------------------------------------------------------------------/
/ The TJpgDec is a generic JPEG decompressor module for tiny embedded systems.
/ This is a free software that opened for education, research and commercial
/ developments under license policy of following terms.
/
/ Copyright (C) 2011, ChaN, all right reserved.
/
/ * The TJpgDec module is a free software and there is NO WARRANTY.
/ * No restriction on use. You can use, modify and redistribute it for
/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY.
/ * Redistributions of source code must retain the above copyright notice.
/
/----------------------------------------------------------------------------*/
因此TJpgDec许可是BSD风格的许可证但存在较大差异。因为TJpgDec是嵌入式项目,对以二进制形式的分发,如嵌入式代码,hex文件或二进制库,未指定以增加其可用性。分发的文档不强制包含关于tjpgdec及其授权文件。TJpgDec是基于GNU GPL兼容的项目。 当有任何修改下重新分发,许可证也可以改为GNU GPL或BSD许可证。
TJpgDec使用说明的更多相关文章
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
- awk使用说明
原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...
- TJpgDec—轻量级JPEG解码器
TJpgDec-轻量级JPEG解码器 本文由乌合之众lym瞎编,欢迎转载blog.cnblogs.net/oloroso 下文中解码一词皆由decompression/decompress翻译而来. ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...
- Oracle 中 union 和union all 的简单使用说明
1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...
- Map工具系列-02-数据迁移工具使用说明
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- Map工具系列-03-代码生成BySQl工具使用说明
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- jQuery验证控件jquery.validate.js使用说明
官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...
- gdbsever 使用说明
gdbsever 使用说明 在新塘N3292x平台下 编译 gdbsever ./configure --target=arm-linux --host=arm-linux arm-linux-gdb ...
随机推荐
- HFSS仿真小例
微带拐角对比实验 微带四分之波长变换器插入前后对比 P1 P2 分配波端口激励,设置差分信号线 微带线差分对的差模阻抗随着差分线间距的增大而增大,随着线宽的增大而减小: 共模阻抗随着差分线间距的增大而 ...
- 编译自己的Ubuntu内核
很多时候我们在使用Ubuntu的时候,想修改一下内核配置,然后编译,安装到Ubuntu中.这也是进行Ubuntu内核开发的前提. 获取当前Ubuntu对应代码 有很多方法可以获得Ubuntu内核代码, ...
- CSS布局
1流动模型 先来说一说流动模型,流动(Flow)是默认的网页布局模式.也就是说网页在默认状态下的 HTML 网页元素都是根据流动模型来分布网页内容的. 流动布局模型具有2个比较典型的特征: 第一点,块 ...
- Mongodb的安装使用
1.下载 最好不要去.com的那个网站下载: 各个版本的下载地址: http://dl.mongodb.org/dl/win32/x86_64 2.压缩包版本: 下载压缩包版本,目录结构如图: ...
- Android---观察者模式的简单实现demo
ObserverListerner: subjectListener: 观察者管理类: 使用方法: 1. 接口: 2. 注册观察者: 3. 通知:(触发事件执行): 4. 实现方法:(都要写, 只在要 ...
- Docker安装CentOS
系统环境: 腾讯云公共镜像 CoreOS 7.1 X64 #docker 下载centos镜像docker pull centos #下载centos所有的镜像docker pull ...
- _web基础_servlet基础
一.了解Servlet的概念 Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容.Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能.Ser ...
- python学习之路 第六天
1.正则表达式 re.match() 从头匹配: re.match("[0-9]","123abc789") 只匹配一个数字: re.match("[ ...
- blog (后续更新)
设计Model(设计数据库) from django.db import models # Create your models here. class BlogsPost(models.Model) ...
- C#面向对象设计模式纵横谈——3.Abstract Factory 抽象工厂(创建型模式)
动机(Motivation) 在软件系统中经常面临着“一系列相互依赖的对象”的创建工作,同时,由于需求变化,往往存在更多系列对象的创建工作.如何应对这种变化?如何绕过常规对象的创建,提供一种“封装机制 ...