整理自:
https://blog.csdn.net/ice__snow/article/details/52563944
http://blog.csdn.net/mcgrady_tracy/article/details/7439066
用
libjpeg庫讀取jpeg檔案
,官網連結:http://libjpeg.sourceforge.net/,下載下傳連結:http://www.ijg.org/files/。
本檔案使用的是9c這個版本。
---------------------------------------------------------------------------------------------------------------------------------------------
一、編譯出libjpeg.lib檔案
1. 下載下傳并解壓
2. 找到jconfig.cv,複制并改名為jconfig.h
3. 找到makefile.vc這個檔案,打開(随便一個文本編輯器)找到這一行
把路徑改為
win32.mk
在你電腦上的路徑,每個人的可能不太一樣,路徑差别可能不是很大,我的是
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\win32.mak
,改為
4. 準備編譯,從VS的工具點選“Visual Studio 指令提示”進入控制台
5. 進入jpeg-9c的目錄,輸入編譯指令開始編譯
指令:
nmake -f makefile.vc
6. 編譯後在目錄下找到庫 libjpeg.lib
就編譯成功了。
libjpeg.lib
----------------------------------------------------------------------------------------------------------------------------------------------
二、使用
具體的使用在目錄下的example.c中有,注釋非常細,看了基本就會用了。
1. 配置
在VS中配置libjpeg.lib,配置方法略
2. 使用
程式裡包含頭檔案
#include "jpeglib.h"
就行了。
大部分照搬,細節可以看裡面的英語注釋,主要的幾個地方修改下就行了,看下面的漢語注釋:
/*讀JPEG檔案相當于解壓檔案*/
int read_jpeg_file(const char *input_filename, const char *output_buffer)
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE *input_file;
FILE *output_file;
JSAMPARRAY buffer;
int row_width;
unsigned char *output_buffer;
unsigned char *tmp = NULL;
cinfo.err = jpeg_std_error(&jerr);
if ((input_file = fopen(input_filename, "rb")) == NULL) {
fprintf(stderr, "can't open %s\n", input_filename);
return -1;
}
// Initialization of JPEG compression objects
jpeg_create_decompress(&cinfo);
/* Specify data source for decompression */
jpeg_stdio_src(&cinfo, input_file);
/* 1.設定讀取jpg檔案頭部,Read file header, set default decompression parameters */
(void) jpeg_read_header(&cinfo, TRUE);
/* 2.開始解碼資料 Start decompressor */
(void) jpeg_start_decompress(&cinfo);
row_width = cinfo.output_width * cinfo.output_components;
/* 3.跳過讀取的頭檔案位元組Make a one-row-high sample array that will go away when done with image */
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_width, 1);
output_buffer = (unsigned char *)malloc(row_width * cinfo.output_height);
memset(output_buffer, 0, row_width * cinfo.output_height);
tmp = output_buffer;
/* 4.Process data由左上角從上到下行行掃描 */
while (cinfo.output_scanline < cinfo.output_height) {
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
memcpy(tmp, *buffer, row_width);
tmp += row_width;
}
//free(output_buffer);
(void) jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
/* Close files, if we opened them */
fclose(input_file);
fclose(output_file);
return 0;
}
也可以将代碼中的第4步中
……
memcpy(tmp, *buffer, row_width);
tmp += row_width;
……
替換為
// 在這裡添加代碼擷取到圖檔的像素資料
// buffer儲存了讀取的目前行的資料,儲存順序是RGB
// output_scanline是已經讀取過的行數
// img.create(cinfo.image_height, cinfo.image_width, 3); //放在while外
for (int i = 0; i < img.cols; ++i) {
img[cinfo.output_scanline - 1][i * 3 + 2] = buffer[0][i * 3 + 0];
img[cinfo.output_scanline - 1][i * 3 + 1] = buffer[0][i * 3 + 1];
img[cinfo.output_scanline - 1][i * 3 + 0] = buffer[0][i * 3 + 2];
}