1.å¦ä½ç¨Visual Studioç¼è¯IJG JPEGåº
2.kali里边怎么安装libjpeg-turbo8这个库?急急急
3.å¦ä½ä½¿ç¨libjpeg
4.音视频探索(5):JPEG格式与Libjpeg库编译移植
å¦ä½ç¨Visual Studioç¼è¯IJG JPEGåº
ãã以ä¸æ¯å 个éè¦çæ¥éª¤ï¼
ãã1ãå°IJGå®æ¹ç½ç«ä¸ä¸è½½JPEGåºçæºä»£ç ï¼ç®åææ°ççæ¬æ¯ç¬¬9çï¼ mand promptï¼cd å°æºä»£ç æå¨æ件夹ã注æï¼command prompt åcmdæ¯æåºå«çï¼ä¸è¦ç¨cmdï¼ä¹ä¸è¦ç¨Xè¿ä¸ªé ç½®çã
ãã4ãç¶åå¨å½ä»¤è¡ä¸é®å ¥ï¼
ããD:\libjpeg\jpeg-9>nmake -f makefile.vc setup-v
ããè¾åºï¼
ããMicrosoft (R) Program Maintenance Utility Version ...
ããCopyright (C) Microsoft Corporation. All rights reserved.
ããren jconfig.vc jconfig.h
ããren makejsln.v jpeg.sln
ããren makeasln.v apps.sln
ããren makejvcx.v jpeg.vcxproj
ããren makejfil.v jpeg.vcxproj.filters
ããren makecvcx.v cjpeg.vcxproj
ããren makecfil.v cjpeg.vcxproj.filters
ããren makedvcx.v djpeg.vcxproj
ããren makedfil.v djpeg.vcxproj.filters
ããren maketvcx.v jpegtran.vcxproj
ããren maketfil.v jpegtran.vcxproj.filters
ããren makervcx.v rdjpgcom.vcxproj
ããren makerfil.v rdjpgcom.vcxproj.filters
ããren makewvcx.v wrjpgcom.vcxproj
ããren makewfil.v wrjpgcom.vcxproj.filters
ããè¿ä¸ªå½ä»¤è¡æ¯ç¨äºå建VS 解å³æ¹æ¡çï¼è¿ä¸ªå½ä»¤è¿è¡ç»æï¼æºä»£ç æ件夹éå°ä¼çæslnåvcxprojæ件çã
ãã5ãç¨vs æå¼è§£å³æ¹æ¡ï¼buildï¼æ建ï¼å®å³å¯ï¼éåå°å¨æºä»£ç çæ件夹ä¸çæä¸ä¸ªreleaseæ件夹ï¼jpeg.libå°±å¨å ¶ä¸
ãã...\..\Release\jpeg.lib
ãã========== Build: 1 succeeded,码下 0 failed, 0 up-to-date, 0 skipped ==========
ããå¨è¿ä¸ªè¿ç¨ä¸æ³¨æå¦æè¦è°æ´ç¼è¯è¾åºæ¹å¼ä¸ºdebugéè¦å¨configurationä¸æ°å»ºDebugç¼è¯æ¹å¼ï¼åçXæå ¶ä»ç¼è¯æ¹æ³ä¹éè¦é ç½®ã
ãã6ã注æä¸è¦ç¼è¯ædllåºï¼å¨jpegçå®ç°ä¸æ¯æ²¡æç¨å¯¼åºç¬¦å·çï¼å½æ°å¨å ¶ä»ç¨åºä¸æ¯æ æ³è¢«è¯å«çï¼å¨é¾æ¥æ¯ä¼æ¥éã
ãã7ã使ç¨libåºï¼å¨ä½ çå·¥ç¨éæ£ç¡®é ç½®libåºçè·¯å¾ï¼å¨å±æ§å¯¹è¯æ¡çé ç½®æ ä¸linkerï¼é¾æ¥å¨ï¼çinpuï¼è¾å ¥ï¼ä¸å ä¸jpegåºçæ件åå³å¯ã
kali里边怎么安装libjpeg-turbo8这个库?急急急
下载libjpeg-turbo源码。
安装编译依赖包。码下
$ sudo apt-get install nasm
编译安装。码下
第一步,码下移动到源文件目录,码下并执行autoreconf -fiv 命令。码下淘宝客拼多多源码
第二步,码下运行configure脚本并加上配置参数。码下我们就直接在源目录执行,码下不用创建build目录了。码下
不过在运行之前,码下我们查看一下/usr/local/lib下有没有libjpeg.so*文件,码下有的码下并发编程 源码话我们执行操作,删除这些文件。码下sudo rm -rf /usr/local/lib/libjpeg.so*否则,码下直接执行此步即可。
$ ./configure --prefix=/usr/local --mandir=/usr/local/share/man --with-jpeg8 --disable-static --docdir=/usr/local/share/doc/libjpeg-turbo-1.5.2
解释一下各项参数简单意思。
–prefix=/usr/local 指定库安装路径
–mandir=/usr/local/share/man 指定man文件(相关命令参考信息)安装路径
–with-jpeg8 这个开关启用与libjpeg 版本8的兼容性,即可使用libjpeg8的cpa电影源码API.
–disable-static 阻止安装静态版本的库
–docdir=/usr/local/share/doc/libjpeg-turbo-1.5.2 指定文档安装路径
第三步,编译及安装。
$ make$ sudo make install
另外建议看看《Linux就该这么学》这本书熟悉下命令
å¦ä½ä½¿ç¨libjpeg
æ¬æåªä»ç»jpegå缩çç¸å ³å 容ï¼åå¼å§æè´ªå¾çäºï¼éç¨å¾® 软 çGDI Plusæä¾çåè½ï¼å¾æ¯æ¹ä¾¿ï¼å è·åjpgå¾åçç¼ç ï¼ç¶åæ ¹æ®å¾åçä½å¾æ°æ®å建ä¸ä¸ªBitmapç±»ç对象ï¼åä¿åå¾å为jpgæ ¼å¼å°±è¡äºãä½æ¯æ对 GDI+è¿æ¯å¾ä¿¡ä»»ï¼æ»æè§ä¸è¸å®ï¼æ²¡æçç±çï¼ï¼æ们çç³»ç»ä¸æ¦å®è£ å°±è¦é¿æè¿è¡ï¼æå°±æ¯æ å¿é¿æè¿è¡ä¸æ®µæ¶é´åGDI+ä¼åºé®é¢ï¼ç»æä¹è¯å®äºæçæ å¿ï¼æ们å®é 使ç¨çå¥ç³»ç»ä¸æä¸å¥ï¼è¿ç»è¿è¡3ï¼5天åï¼GDI+å°±ä¼å´©æºï¼äºæ¯æå³å¿éç¨IJG JPEG Libraryãæ¨å¯ä»¥å°
ç«ä¸è½½libjpegçæºç ï¼ IJG JPEG Libraryå°±æ¯jpegå缩åºï¼æ¯ä»¥æºç çå½¢å¼æä¾ç»è½¯ä»¶å¼å人åçï¼å½ç¶å¨è½¯ä»¶å éä¹æç¼è¯å¥½çåºæ件ï¼æ们è¿éå°±åªç¨å°å ¶ä¸ç libjpeg.libï¼jconfig.hï¼jmorecfg.hï¼jpeglib.hè¿å 个æ件ï¼ä¸é¢æå°±ä»ç»ä¸ä¸ææ ·å¨èªå·±çç¨åºéåµå ¥å¾åå缩å è½ã
ããä¸ã建ç«ç¼è¯ç¯å¢
ããæè°å»ºç«ç¼è¯ç¯å¢ï¼å ¶å®é常ç®åï¼å°±æ¯æä¸é¢æå°ç4个æä»¶æ· è´å°ä½ ç项ç®æ件夹ä¸ï¼ælibjpeg.libæ·»å å°ä½ ç项ç®ä¸ï¼ç¶åå¨ä½ å®æå缩åè½çé£ä¸ªæ件éå å ¥#include "jpeglib.h"ï¼éè¦æ³¨æçæ¯ï¼libjpeg.libæ¯ç¨cè¯è¨å¼åçï¼å¦æè¦ç¨å¨ä½ çC++ç¨åºéï¼éè¦ç¨å°extern "C"ï¼å¦ä¸ï¼
// TestLibjpeg.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "memory.h"
extern "C" {
#include "jpeglib.h"
}
ããäºãå缩æ¥éª¤
ãã1ãç³è¯·å¹¶åå§åjpegå缩对象ï¼åæ¶è¦æå®é误å¤çå¨
struct jpeg_compress_struct jcs;
// 声æé误å¤çå¨ï¼å¹¶èµå¼ç»jcs.errå
struct jpeg_error_mgr jem;
jcs.err = jpeg_std_error(&jem);
jpeg_create_compress(&jcs);
ãã2ãæå®å缩åçå¾åæåæ¾çç®æ æ件ï¼æ³¨æï¼ç®æ æ件åºä»¥äºè¿å¶æ¨¡å¼æå¼
f=fopen(".jpg","wb");
if (f==NULL)
{
delete [] data;
delete [] pDataConv;
return 0;
}
jpeg_stdio_dest(&jcs, f);
ãã3ã设置å缩åæ°ï¼ä¸»è¦åæ°æå¾å宽ãé«ãè²å½©ééæ°ï¼1ï¼ç´¢å¼å¾åï¼3ï¼å ¶ä»ï¼ï¼è²å½©ç©ºé´ï¼JCS_GRAYSCALE表示ç°åº¦å¾ï¼JCS_RGB表示彩è²å¾åï¼ï¼å缩质éçï¼å¦ä¸ï¼
jcs.image_width = nWidth; // 为å¾ç宽åé«ï¼åä½ä¸ºåç´
jcs.image_height = nHeight;
jcs.input_components = 1; // å¨æ¤ä¸º1,表示ç°åº¦å¾ï¼ å¦ææ¯å½©è²ä½å¾ï¼å为3
jcs.in_color_space = JCS_GRAYSCALE; //JCS_GRAYSCALE表示ç°åº¦å¾ï¼JCS_RGB表示彩è²å¾å
jpeg_set_defaults(&jcs);
jpeg_set_quality (&jcs, , true);
éè¦æ³¨æçæ¯ï¼jpeg_set_defaultså½æ°ä¸å®è¦ç设 置好å¾å宽ãé«ãè²å½©ééæ°è®¡è²å½©ç©ºé´å个åæ°åæè½è°ç¨ï¼å 为è¿ä¸ªå½æ°è¦ç¨å°è¿å个å¼ï¼è°ç¨jpeg_set_defaultså½æ°åï¼jpeglib åºéç¨é»è®¤ç设置对å¾åè¿è¡å缩ï¼å¦æéè¦æ¹å设置ï¼å¦å缩质éï¼è°ç¨è¿ä¸ªå½æ°åï¼å¯ä»¥è°ç¨å ¶å®è®¾ç½®å½æ°ï¼å¦jpeg_set_qualityå½æ°ãå ¶å® å¾åå缩æ¶æ好å¤åæ°å¯ä»¥è®¾ç½®ï¼ä½å¤§é¨åæ们é½ç¨ä¸ç设置ï¼åªéè°ç¨jpeg_set_defaultså½æ°å¼ä¸ºé»è®¤å¼å³å¯ã
ãã4ãä¸é¢çå·¥ä½åå¤å®æåï¼å°±å¯ä»¥å缩äºï¼å缩è¿ç¨é常ç®åï¼ é¦å è°ç¨jpeg_start_compressï¼ç¶åå¯ä»¥å¯¹æ¯ä¸è¡è¿è¡å缩ï¼ä¹å¯ä»¥å¯¹è¥å¹²è¡è¿è¡å缩ï¼çè³å¯ä»¥å¯¹æ´ä¸ªçå¾åè¿è¡ä¸æ¬¡å缩ï¼å缩å®æåï¼ è®°å¾è¦è°ç¨jpeg_finish_compresså½æ°ï¼å¦ä¸ï¼
jpeg_start_compress(&jcs, TRUE);
JSAMPROW row_pointer[1]; // ä¸è¡ä½å¾
int row_stride; // æ¯ä¸è¡çåèæ°
row_stride = jcs.image_width; // å¦æä¸æ¯ç´¢å¼å¾,æ¤å¤éè¦ä¹ä»¥3
// 对æ¯ä¸è¡è¿è¡å缩
while (jcs.next_scanline < jcs.image_height) {
row_pointer[0] = & pDataConv[jcs.next_scanline * row_stride];
jpeg_write_scanlines(&jcs, row_pointer, 1);
}
jpeg_finish_compress(&jcs);
ãã5ãæåå°±æ¯éæ¾å缩工ä½è¿ç¨ä¸æç³è¯·çèµæºäºï¼ä¸»è¦å°±æ¯jpegå缩对象ï¼ç±äºå¨æ¬ä¾ä¸ææ¯ç´æ¥ç¨çå±é¨åéï¼æ以åªéè°ç¨jpeg_destroy_compressè¿ä¸ªå½æ°å³å¯ï¼å¦ä¸ï¼
jpeg_destroy_compress(&jcs);
ããä¸ã解å缩æ¥éª¤
ãã解å缩æ¥éª¤ä¸å缩æ¥éª¤é常ç¸ä¼¼ï¼åªæ¯è§£å缩对象为jpeg_decompress_structç±»åï¼æ¥éª¤å¦ä¸ï¼
ãã1ã声æ并åå§å解å缩对象ï¼åæ¶å¶å®é误信æ¯ç®¡çå¨
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
ãã2ãæå¼jpgå¾åæ件ï¼å¹¶æå®ä¸ºè§£å缩对象çæºæ件
FILE *f = fopen(strSourceFileName,"rb");
if (f==NULL)
{
printf("Open file error!\n");
return;
}
//
jpeg_stdio_src(&cinfo, f);
ãã3ã读åå¾åä¿¡æ¯
jpeg_read_header(&cinfo, TRUE);
ãã4ãæ ¹æ®å¾åä¿¡æ¯ç³è¯·ä¸ä¸ªå¾åç¼å²åº
data = new BYTE cinfo.image_width*cinfo.image_height*cinfo.num_components];
ãã5ãå¼å§è§£å缩
jpeg_start_decompress(&cinfo);
JSAMPROW row_pointer[1];
while (cinfo.output_scanline < cinfo.output_height)
{
row_pointer[0] = &data[(cinfo.output_height - cinfo.output_scanline-1)*cinfo.image_width*cinfo.num_components];
jpeg_read_scanlines(&cinfo,row_pointer ,
1);
}
jpeg_finish_decompress(&cinfo);
ãã6ãéæ¾èµæº
jpeg_destroy_decompress(&cinfo);
fclose(f);
ãã好äºï¼å©ç¨IJG JPEG Libraryè¿è¡å¾åå缩就ä»ç»å°è¿éï¼å¸æ对大家ææ帮å©ï¼å®ä¾ä»£ç å·²ç»å®ç°äºå¾åçå缩å解å缩çå ¨é¨åè½ï¼å½ä»¤æ ¼å¼ 为ï¼âTestLibjpeg.exe j|j|b æºæ件å ç®æ æ件åâï¼å ¶ä¸ï¼jé项å°æºæ件å缩为jpgæ ¼å¼ï¼ä¸æ¹åè²å½©æ¨¡å¼ï¼jé项å°æºæ件å缩为为jpgæ ¼å¼ï¼bé项å°æºæ件解å缩为bmpæ ¼å¼ï¼ 该å®ä¾å¹¶æ²¡ææä¾æ件æææ§çéªè¯ï¼å¦æè¦å¼å ¥èªå·±ç代ç ï¼è¯·èªå·±å®ç°æ件æææ§çéªè¯ã
音视频探索(5):JPEG格式与Libjpeg库编译移植
libJPEG-turbo是一个强大的JPEG图像处理库,它支持JPEG格式的编码和解码,尤其对于Android平台,其底层压缩常采用libJPEG。然而,新势源码Android系统为适应低版本设备,压缩算法非标准,可能导致图像质量和压缩性能的权衡。因此,本篇将介绍如何利用AS的Cmake工具编译libJPEG-turbo,并通过JNI/NDK技术引入哈夫曼编码以优化Android中的刷屏器源码压缩质量。
哈夫曼编码是一种无损压缩方法,年由Huffman提出。它依据字符出现概率构造编码,概率高的信息编码较短。在图像压缩中,通过计算像素概率生成Huffman码表,编码后的图像数据记录每个像素的码字,与码表对应。例如,通过构建赫夫曼树,字符集中的字符对应树的路径,形成编码。
libJPEG-turbo中的JPEG编码与解码过程包括:分配压缩对象,设置输出和参数,逐行处理数据,以及解压时分配和初始化解压对象、读取数据等。其核心结构体如jpeg_compress_struct和jpeg_decompress_struct,分别用于压缩和解压缩操作。
为了在Android上实现优化,我们需要从libjpeg-turbo源码开始,首先在CmakeLists.txt中配置项目,然后在Java层编写JNI方法,将C++的哈夫曼编码逻辑与Java代码连接。编译后,会生成libjpegtil.so文件,将其与libjpeg.so一同引入目标项目。