libjpeg(1)
生活随笔
收集整理的這篇文章主要介紹了
libjpeg(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
開發包的話直接在網上可以下載,里面包含了頭文件 靜態庫以及動態庫!
下面說一下壓縮編碼基本的調用流程
/*圖像數據格式:*標準輸入圖像格式是像素的矩形陣列*每個像素具有相同數量的“分量”值(顏色通道)。*每個像素行是一組JSAMPLE(通常是unsigned chars)。*如果您正在使用顏色數據,則每個像素的顏色值*必須在行中相鄰; 例如,用于24位的R,G,B,R,G,B,R,G,B,... RGB顏色。**對于這個例子,我們假設這個數據結構與之匹配*我們的應用程序將圖像存儲在內存中,所以我們可以傳遞一個指向我們的圖像緩沖區。*//*JPEG壓縮的示例程序。*我們假設目標文件名 分辨率和壓縮因子被傳入*/ #include“jpeglib.h” #include <setjmp.h>void write_JPEG_file (char *filename,int image_width,int image_height, int quality,JSAMPLE *image_buffer) {/* 此結構體包含JPEG壓縮參數和指針工作空間(由JPEG庫根據需要分配)* 可以有多個這樣的結構,代表多個壓縮/解壓縮過程,一次存在。* 我們參考作為“JPEG對象”的任何一個結構(及其關聯的工作數據)*/struct jpeg_compress_struct cinfo;/* 此結構體表示JPEG錯誤處理程序* 它是單獨聲明的,因為應用程序經常要提供一個專門的錯誤處理程序* 采取簡單的方法,并使用標準的錯誤處理程序*/struct jpeg_error_mgr jerr;FILE *outfile; /* 目標文件 */JSAMPROW row_pointer[1]; /* 指向JSAMPLE的每一行的地址*/int row_stride; /* 圖像緩沖區中的物理行寬度 *//* 步驟1:分配和初始化JPEG壓縮對象* //* 我們必須首先設置錯誤處理程序,以防初始化失敗*/cinfo.err = jpeg_std_error(&jerr);/* 現在我們可以初始化JPEG壓縮對象。*/jpeg_create_compress(&cinfo);/* 步驟2:指定數據目的地(例如,文件)*//* 注意:步驟2和3可以按任一順序完成。*//* 這里我們使用庫提供的代碼將壓縮數據發送到 stdio流。* 你也可以編寫自己的代碼來做別的事情。* 使用“b”選項來fopen()需要它來編寫二進制文件。*/if ((outfile = fopen(filename, "wb")) == NULL) {fprintf(stderr, "can't open %s\n", filename);exit(1);}jpeg_stdio_dest(&cinfo, outfile);/* 步驟3:設置壓縮參數* //* 首先我們提供輸入圖像的描述。* cinfo結構的四個字段必須填寫:*/cinfo.image_width = image_width; /* 圖像寬度和高度,以像素為單位*/cinfo.image_height = image_height;cinfo.input_components = 3; /* 每像素的顏色分量*/cinfo.in_color_space = JCS_RGB; /* 輸入圖像的顏色空間* //* 現在使用庫的例程設置默認壓縮參數。*(您必須至少設置cinfo.in_color_space才能調用這個,由于默認值取決于源顏色空間。)*/jpeg_set_defaults(&cinfo);/* 現在您可以設置任何您想要的非默認參數。* 這里我們只是說明使用質量(量化表)縮放:*/jpeg_set_quality(&cinfo, quality, TRUE /*limit to baseline-JPEG values */);/* 步驟4:啟動壓縮*//* TRUE確保我們將編寫一個完整的交換JPEG文件。* 通過TRUE,除非你非常確定你在做什么。*/jpeg_start_compress(&cinfo, TRUE);/* 步驟5:while(掃描 等待寫入的每行)*//* jpeg_write_scanlines(...); *//*這里我們使用庫的狀態變量cinfo.next_scanline作為循環計數器*/row_stride = image_width * 3; /* 在image_buffer中每行的JSAMPLE */while (cinfo.next_scanline < cinfo.image_height) {/*jpeg_write_scanlines需要一組指向掃描線的指針。*這里的數組只有一個元素長,但你可以通過一次掃描線一次,如果這樣更方便。*/row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);}/*步驟6:完成壓縮 */jpeg_finish_compress(&cinfo);/*在finish_compress之后,我們可以關閉輸出文件。*/fclose(outfile);/*步驟7:釋放JPEG壓縮對象* //*這是一個重要的步驟,因為它會釋放大量的內存。*/jpeg_destroy_compress(&cinfo);}
總結
以上是生活随笔為你收集整理的libjpeg(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取进程或线程的ID以及句柄信息
- 下一篇: php怎么返回json格式的数据