使用Ilj编解码Jpeg文件

2011-04-27 14:35:30|  分类: 技术系列 |  标签:jcprops  jerr  解码  dibchannels  lptemp    字号:大中小 订阅

http://xinmeng2011.blog.163.com/blog/static/177542203201132721951435/
看看网上没有 完成的编解码的代码。 这里写出来 给懒人提供一些code。

首先 添加头文件 和 所需要的库

#include "IJL/include/ijl.h"

#pragma comment(lib,"IJL//lib//ijl15.lib")

1  解码。

原型: bool decodeFromJPEGBuffer(unsigned char* lpJpgBuffer,unsigned int dwJpgBufferSize,unsigned char** lppRgbBuffer,unsigned int* lpdwWidth,unsigned int* lpdwHeight,unsigned int* lpdwNumberOfChannels)

bool bres;
IJLERR jerr;
DWORD dwWholeImageSize;
BYTE* lpTemp = NULL;
JPEG_CORE_PROPERTIES jcprops;
bres = true;
__try
{
jerr = ijlInit(&jcprops);
if(IJL_OK != jerr)
{
bres = false;
__leave;
}
jcprops.JPGFile = NULL;
jcprops.JPGBytes = lpJpgBuffer;
jcprops.JPGSizeBytes = dwJpgBufferSize;
jerr = ijlRead(&jcprops, IJL_JBUFF_READPARAMS);
if(IJL_OK != jerr)
{
bres = false;
__leave;
}
switch(jcprops.JPGChannels)
{
case 1:
{
jcprops.JPGColor = IJL_G;
jcprops.DIBColor = IJL_BGR;
jcprops.DIBChannels = 3;
break;
}
case 3:
{
jcprops.JPGColor = IJL_YCBCR;
jcprops.DIBColor = IJL_BGR;
jcprops.DIBChannels = 3;
break;
}
default:
{
jcprops.JPGColor = IJL_OTHER;
jcprops.DIBColor = IJL_OTHER;
jcprops.DIBChannels = jcprops.JPGChannels;
break;
}
}
dwWholeImageSize = jcprops.JPGWidth * jcprops.JPGHeight *
jcprops.DIBChannels;
lpTemp = new BYTE [dwWholeImageSize];

注意 在解码中是 函数内部申请内存 在调用之后要释放掉
if(NULL == lpTemp)
{
bres = false;
__leave;
}
jcprops.DIBWidth = jcprops.JPGWidth;
jcprops.DIBHeight = jcprops.JPGHeight;
jcprops.DIBPadBytes = 0;
jcprops.DIBBytes = lpTemp;
jerr = ijlRead(&jcprops, IJL_JBUFF_READWHOLEIMAGE);
if(IJL_OK != jerr)
{
bres = false;
__leave;
}
}
__finally
{
if(FALSE == bres)
{
if(NULL != lpTemp)
{
delete [] lpTemp;
lpTemp = NULL;
}
}
ijlFree(&jcprops);
*lpdwWidth = jcprops.DIBWidth;
*lpdwHeight = jcprops.DIBHeight;
*lpdwNumberOfChannels = jcprops.DIBChannels;
*lppRgbBuffer = lpTemp;
}

return bres;

2  编码。

bool EncodeToJPEGBuffer(BYTE* pRgbBuffer,DWORD dwWidth,DWORD dwHeight,BYTE* pJpgBuffer,DWORD &dwJpgBufferSize)
// 源RGB数据 未对齐的(in)    图像宽度(in)  图像高度 (in)  编码后的JpegBuf(out)  JpegBuf的长度(out)  
{
DWORD   dwRgbBufferSize = dwWidth * dwHeight;//计算出存放图像数据的最大空间
预先算出最大的Jpg大小 
IJLERR jerr;

JPEG_CORE_PROPERTIES jcprops;

// Set up the info on the desired DIB properties.
ijlInit(&jcprops);
!!!初始化之后必须释放 否则内存泄漏

填充jcprops 结构体
jcprops.DIBBytes       = pRgbBuffer;

jcprops.DIBWidth       = dwWidth;

jcprops.DIBHeight      = dwHeight; // Implies a bottom-up DIB.

jcprops.DIBPadBytes    = 0;

jcprops.DIBChannels    = 3;//单通道图像表示一个字节就是一个像素,-3标识-3个字节表示一个像素

jcprops.DIBColor       = IJL_BGR;

jcprops.DIBSubsampling = IJL_NONE;//通道数决定的

//目标JPG图像的设置

jcprops.JPGFile        = NULL;
//  若直接产生JPG文档则填充该变量
jcprops.JPGSizeBytes   = dwRgbBufferSize;//Max buffer size.

jcprops.JPGWidth       = dwWidth;

jcprops.JPGHeight      = dwHeight;

jcprops.JPGChannels    = 3;

jcprops.JPGColor       = IJL_RGB;//灰度彩色空间Grayscale color space.

jcprops.JPGSubsampling = IJL_NONE; // 4:1:1 subsampling

jcprops.JPGBytes       = pJpgBuffer;//Pointer to buffer based JPEG.

jcprops.jquality          = 60; // Select "good" image quality【-100】

jerr =
ijlWrite(&jcprops,IJL_JBUFF_WRITEWHOLEIMAGE);

ijlFree(&jcprops );
if(IJL_OK != jerr)//发生错误提示信息

{

AfxMessageBox((LPCTSTR)ijlErrorStr(jerr),MB_OK,NULL);//ijlErrorStr---Return a pointer to a string with error description.

return FALSE;

}

dwJpgBufferSize = jcprops.JPGSizeBytes;//供外部引用,计算数据量的大小

return TRUE;

}

PS Endode部分的内存是自己提供的 不在内部分配 外部释放 和解码不太一样。 而送入的内存区大小不能小于 w*h 。 否则程序访问非法内存 就挂了

其中 IJL_DIB_PAD_BYTES  可以设置

使用Ilj编解码Jpeg文件相关推荐

  1. libjpeg解码 jpeg文件

    Libjpeg 是一个广泛使用的 C 库,用于读取和写入 JPEG 图像文件. 这篇文章主要讲解在 LCD 上,使用 Libjpeg 库显示图片,以及图片的缩放. 文章目录 一.解压 libjpeg- ...

  2. c语言编译asn1文件,使用 asn1.c 开源编译工具生成 S1AP R15消息编解码C文件

    目录 一.环境: 二.依赖库 三.步骤 四.参考 五.附加资源 一.环境 Ubuntu 14.04.3 LTS 二.依赖库 LIB:   automake ,libtool,bison,flex 三. ...

  3. 数据压缩第七周作业——JPEG编解码

    目录 一.实验目的 二.实验原理 1.JPEG编码器:​编辑 2.JPEG解码器 3.JPEG文件解析 三.实验内容 (1)调试和理解JPEG解码器程序 (2)理解程序设置 1.结构体理解 2.梳理代 ...

  4. labview霍夫曼编码_哈夫曼编解码压缩解压文件—C++实现

    前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...

  5. [Image_Codec]常见图片格式的封装及编解码-Android平台(三)JPG

    文章目录 JPG图片格式 压缩模式和步骤 JPG文件结构 libjpeg编解码Jpeg图片 JPG图片格式 JPG全称Jpeg(Joint Photographic Experts Group),是一 ...

  6. 图像解码之一——使用libjpeg解码jpeg图片

    多媒体应用在现在电子产品中的地位越来越重要,尤其是在嵌入式设备中.本系列文章将会介绍利用libjpeg解码jpeg文件,libpng解码png文件,libgif解码gif文件.本文为第一篇,介绍使用l ...

  7. 视音频编解码学习工程:JPEG分析器

    ===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...

  8. 【STM32F407VET6开发】第三章 jpeg编解码实验(有误,待修改)

    目录 一.硬件连接(STM32F407VETx.仿真器) 二.配置Debugger 三.通过串口协议,实现对jpeg图片编解码后传回电脑验证 四.结果 一.硬件连接(STM32F407VETx.仿真器 ...

  9. JPG文件编解码详解——详细介绍编码和解码JPG

    http://blog.csdn.net/zhengzhoudaxue2/article/details/7693258 JPEG文件编/解码详解 cat_ng 猫猫 JPEG(Joint Photo ...

最新文章

  1. Python基础01-Python环境搭建与HelloWorld
  2. Python根据多个空格Split字符串
  3. (多图) 基于FPGA的FIR数字滤波器设计与仿真
  4. Kaggle竞赛方案分享:如何分辨杂草和植物幼苗(转)
  5. C/C++端口复用SO_REUSEADDR(setsockopt参数)
  6. GARFIELD@01-04-2005
  7. Linux内核源码阅读之系统调用mmap()
  8. mysql碎片data free_浅析MySQL数据碎片的产生(data free)
  9. Bias and Variance with Mismatched Distributions
  10. 最强面试题整理第三弹:Python 后台开发面试题(附答案)
  11. SQLServer数据库日志处理
  12. MATLAB视频转图片保存
  13. 关闭Win 11自动更新工具
  14. html整体图片拆分拼图代码源代码,canvas拼图功能实现代码示例
  15. Java开发技巧!整理了3家面试问题:美团+字节+腾讯,工作感悟
  16. 春秋杯CTF2022 WP
  17. linux取消上一个命令,Linux简介及最常用命令(简单易学,但能解决95%以上的问题)...
  18. 父进程和子进程之间的关系
  19. WiFi密码忘记?电脑密码忘记?
  20. 线性相关线性无关与正交

热门文章

  1. 04_dubbo_ioc
  2. TU-Net/TDeepLab:基于RGB和红外的地形分类
  3. vue3时间戳格式转换
  4. 化妆品电商平台数据分析报告
  5. 掌握最新网管技术 做悠闲网管员
  6. 页面之间数据调转传输
  7. FLV格式文件如何转换成MP4格式 1
  8. 搜索光纤测试软件,了解光纤的常用工具及使用方法
  9. armbian n1 桌面_N1盒子初体验(降级+刷armbian)
  10. java异常排列方式_java中排序报:Comparison method violates its general contract异常的解决...