IJL库之JPEG图片压缩
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IJL库之JPEG图片压缩相关的知识,希望对你有一定的参考价值。
如何将比较大的图片压缩成比较小的图片,通常在相机一直拍图且需要将图片网络传输时,必须压缩图片。相机一般几十FPS,每张几M,只能用JPEG有顺压缩才能到可以实时传输要求。 还有就是这种特定情况压缩需要保证 压缩率 与 压缩速度,那就是用Intel的IJL JPEG压缩库,网上有IJL15.DLL IJL20.DLL,15版本存在内存泄漏,用20版本即可。
例子:
exe执行程序 , ijl20x64.dll 放在同一级目录下。
typedef IJLERR (*pInitFunc)(JPEG_CORE_PROPERTIES*); // ijlInit函数类型
typedef IJLERR (*pWriteFunc)(JPEG_CORE_PROPERTIES*,IJLIOTYPE); // ijlWrite函数类型
typedef IJLERR (*pFreeFunc)(JPEG_CORE_PROPERTIES*); // ijlFree函数类型
pInitFunc funcInit = NULL; // ijlInit 函数指针
pWriteFunc funcWrite = NULL; // ijlWrite 函数指针
pFreeFunc funcFree = NULL; // ijlFree 函数指针
char lpExeName[512] = {0};
HMODULE h = GetModuleHandle( NULL );
::GetModuleFileName( h,lpExeName,512 );
CString strExeName(lpExeName);
int nPos = strExeName.ReverseFind( ‘\\‘ );
CString strLeft,slibLeft,sDllName;
strLeft = strExeName.Left(nPos);
int n = strLeft.ReverseFind(‘\\‘);
slibLeft = strLeft.Left(n);
sDllName = slibLeft + "\\lib\\ijl20x64.dll" ; // ijl20x64.dll 的全路径
m_hIjlModule = LoadLibrary(sDllName); // loadlibrary
// 加载IJL库的函数
funcInit = (pInitFunc)GetProcAddress(m_hIjlModule,"ijlInit");
funcWrite = (pWriteFunc)GetProcAddress(m_hIjlModule,"ijlWrite");
funcFree = (pFreeFunc)GetProcAddress(m_hIjlModule,"ijlFree");
// 设置图片参数
JPEG_CORE_PROPERTIES image;
IJLERR err;
IJLIOTYPE iotype = IJL_JBUFF_WRITEWHOLEIMAGE;
// JPEG 压缩 Basler 4096*2048 的单通道黑白图
unsigned char* saveBasler = (unsigned char*)malloc(4096*2048);
ZeroMemory(saveBasler,4096*2048);
ZeroMemory( &image, sizeof(JPEG_CORE_PROPERTIES));
funcInit( &image ); // 此处会开辟内存,后面对应要用funFree释放
image.DIBWidth = 4096;
image.DIBHeight = 2048;
image.JPGBytes = (unsigned char*)saveBasler;
image.JPGSizeBytes = 8388608; // 4096*2048
image.JPGWidth = 4096;
image.JPGHeight = 2048;
image.jquality = 90;
image.DIBColor = IJL_G;
image.DIBChannels = 1; // 黑白色,如果是RGB真彩色,channel=3 图片SIZE = width*height*3
image.DIBPadBytes = IJL_DIB_PAD_BYTES(image.DIBWidth,1);
image.JPGColor = IJL_G;
image.JPGChannels = 1;
image.JPGSubsampling = IJL_NONE;
image.DIBBytes = tmpBasler;
err = funcWrite (&image, iotype);
int nJpgLen = image.JPGSizeBytes; // 压缩完成后 JPEG图片的大小, 压缩后数据在saveBasler 里面,直接将saveBasler 写入一个JPG文件即可,长度为nJpgLen.
funcFree(&image); // 释放内存
以上是关于IJL库之JPEG图片压缩的主要内容,如果未能解决你的问题,请参考以下文章