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许可证。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理