天天看點

使用libjpeg庫讀取jpeg檔案

整理自:

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這個檔案,打開(随便一個文本編輯器)找到這一行

使用libjpeg庫讀取jpeg檔案

把路徑改為

win32.mk

在你電腦上的路徑,每個人的可能不太一樣,路徑差别可能不是很大,我的是

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\win32.mak

,改為 

使用libjpeg庫讀取jpeg檔案

4. 準備編譯,從VS的工具點選“Visual Studio 指令提示”進入控制台

5. 進入jpeg-9c的目錄,輸入編譯指令開始編譯

指令:

nmake -f makefile.vc

6. 編譯後在目錄下找到庫

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];
}
           

繼續閱讀