使用Ilj编解码Jpeg文件
使用Ilj编解码Jpeg文件
2011-04-27 14:35:30| 分类: 技术系列 | 标签:jcprops jerr 解码 dibchannels lptemp 字号:大中小 订阅
首先 添加头文件 和 所需要的库
#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文件相关推荐
- libjpeg解码 jpeg文件
Libjpeg 是一个广泛使用的 C 库,用于读取和写入 JPEG 图像文件. 这篇文章主要讲解在 LCD 上,使用 Libjpeg 库显示图片,以及图片的缩放. 文章目录 一.解压 libjpeg- ...
- c语言编译asn1文件,使用 asn1.c 开源编译工具生成 S1AP R15消息编解码C文件
目录 一.环境: 二.依赖库 三.步骤 四.参考 五.附加资源 一.环境 Ubuntu 14.04.3 LTS 二.依赖库 LIB: automake ,libtool,bison,flex 三. ...
- 数据压缩第七周作业——JPEG编解码
目录 一.实验目的 二.实验原理 1.JPEG编码器:编辑 2.JPEG解码器 3.JPEG文件解析 三.实验内容 (1)调试和理解JPEG解码器程序 (2)理解程序设置 1.结构体理解 2.梳理代 ...
- labview霍夫曼编码_哈夫曼编解码压缩解压文件—C++实现
前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...
- [Image_Codec]常见图片格式的封装及编解码-Android平台(三)JPG
文章目录 JPG图片格式 压缩模式和步骤 JPG文件结构 libjpeg编解码Jpeg图片 JPG图片格式 JPG全称Jpeg(Joint Photographic Experts Group),是一 ...
- 图像解码之一——使用libjpeg解码jpeg图片
多媒体应用在现在电子产品中的地位越来越重要,尤其是在嵌入式设备中.本系列文章将会介绍利用libjpeg解码jpeg文件,libpng解码png文件,libgif解码gif文件.本文为第一篇,介绍使用l ...
- 视音频编解码学习工程:JPEG分析器
===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...
- 【STM32F407VET6开发】第三章 jpeg编解码实验(有误,待修改)
目录 一.硬件连接(STM32F407VETx.仿真器) 二.配置Debugger 三.通过串口协议,实现对jpeg图片编解码后传回电脑验证 四.结果 一.硬件连接(STM32F407VETx.仿真器 ...
- JPG文件编解码详解——详细介绍编码和解码JPG
http://blog.csdn.net/zhengzhoudaxue2/article/details/7693258 JPEG文件编/解码详解 cat_ng 猫猫 JPEG(Joint Photo ...
最新文章
- Python基础01-Python环境搭建与HelloWorld
- Python根据多个空格Split字符串
- (多图) 基于FPGA的FIR数字滤波器设计与仿真
- Kaggle竞赛方案分享:如何分辨杂草和植物幼苗(转)
- C/C++端口复用SO_REUSEADDR(setsockopt参数)
- GARFIELD@01-04-2005
- Linux内核源码阅读之系统调用mmap()
- mysql碎片data free_浅析MySQL数据碎片的产生(data free)
- Bias and Variance with Mismatched Distributions
- 最强面试题整理第三弹:Python 后台开发面试题(附答案)
- SQLServer数据库日志处理
- MATLAB视频转图片保存
- 关闭Win 11自动更新工具
- html整体图片拆分拼图代码源代码,canvas拼图功能实现代码示例
- Java开发技巧!整理了3家面试问题:美团+字节+腾讯,工作感悟
- 春秋杯CTF2022 WP
- linux取消上一个命令,Linux简介及最常用命令(简单易学,但能解决95%以上的问题)...
- 父进程和子进程之间的关系
- WiFi密码忘记?电脑密码忘记?
- 线性相关线性无关与正交
热门文章
- 04_dubbo_ioc
- TU-Net/TDeepLab:基于RGB和红外的地形分类
- vue3时间戳格式转换
- 化妆品电商平台数据分析报告
- 掌握最新网管技术 做悠闲网管员
- 页面之间数据调转传输
- FLV格式文件如何转换成MP4格式 1
- 搜索光纤测试软件,了解光纤的常用工具及使用方法
- armbian n1 桌面_N1盒子初体验(降级+刷armbian)
- java异常排列方式_java中排序报:Comparison method violates its general contract异常的解决...