zoukankan      html  css  js  c++  java
  • TJpgDec使用说明

    TJpgDec模块应用说明

    怎么使用

    首先,你应该构建和运行如下所示示例程序。这是一个典型的使用TJpgDec模块,它有助于调试和缩小问题。

    解码会话分为两个阶段。第一阶段是分析JPEG图像,第二阶段是解码。

    1. 初始化输入流。(例如:打开一个文件)
    2. 分配JPEG解码对象和工作区域。
    3. 调用jd_prepare取分析和准备压缩的JPEG图像。
    4. 使用解码对象中的图像信息初始化输出设备。
    5. 调用jd_decomp解码JPEG图像。

    系统结构

    TJpgDec系统结构

    示例

    /*------------------------------------------------*/
    /* 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("
    %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.
    ", 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("
    OK  
    ");
    
            } else {
                printf("Failed to decompress: rc=%d
    ", res);
            }
    
            free(devid.fbuf);    /* 释放帧缓冲区 */
    
        } else {
            printf("Failed to prepare: rc=%d
    ", res);
        }
    
        free(work);             /* 释放工作区域 */
    
        fclose(devid.fp);       /* 关闭JPEG文件 */
    
        return res;
    }
    

    限制

    • JPEG标准:仅基线。渐进和无损JPEG格式不支持。
    • 图像大小:最大65520 x 65520像素。
    • 颜色空间:仅YCbCr三通道。灰度图像不支持。
    • 采样因子:4:4:44:2:24: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许可证。

  • 相关阅读:
    java实现 n人过桥问题
    git:rebase的原理
    注解@ConfigurationProperties使用方法
    docker+mysql 更改配置后重启不了的解决方案
    docker+mysql 构建数据库的主从复制
    Linux 踩坑记
    OSS上传图片无法在线预览的解决方案
    Linux中du、df显示不一致问题
    zookeeper作配置中心(存储支付信息)
    @Configuration结合@Bean实现对象的配置
  • 原文地址:https://www.cnblogs.com/oloroso/p/5852235.html
Copyright © 2011-2022 走看看