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图片压缩的主要内容,如果未能解决你的问题,请参考以下文章

Golang压缩Jpeg图片和PNG图片

webpjpegpng三种压缩算法比较

用 javax.imageio 实现图片压缩原理是啥?

Android使用.webp替换.jpeg与.png格式图片减少图片大小

图片加载原理

JPG&PNG图片压缩java实现