生活随笔
收集整理的這篇文章主要介紹了
LIBJPEG-TURBO库移植
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、libjpeg-turbo庫下載
?? ?libjpeg-turbo是libjpeg的升級版,性能有所提升
????????libpng庫鏈接:https://libpng.sourceforge.io/index.html
二、ubuntu上驗證libjpeg-turbo
編譯libjpeg-turbo庫,tar -zxvf libjpeg-turbo-2.1.3.tar.gz && cd libjpeg-turbo-2.1.3 && mkdir build && cd build && cmake .. && make,如下圖
修改djepg.c?
#include "jinclude.h"
#include "jpeglib.h"
#include <setjmp.h>struct my_error_mgr {struct jpeg_error_mgr pub; /* "public" fields */jmp_buf setjmp_buffer; /* for return to caller */};typedef struct my_error_mgr * my_error_ptr;static void my_error_exit (j_common_ptr cinfo)
{my_error_ptr myerr = (my_error_ptr) cinfo->err;(*cinfo->err->output_message) (cinfo);longjmp(myerr->setjmp_buffer, 1);}int main(int argc, char **argv)
{struct jpeg_decompress_struct cinfo;struct my_error_mgr jerr;FILE * infile;FILE * outfile;int row_stride;unsigned char *buffer;struct timeval start,end;gettimeofday(&start, NULL);if (argc != 3){printf("Usage: \n");printf("%s <jpg_file> <output_file>\n", argv[0]);return -1;}// 指定源文件if ((infile = fopen(argv[1], "rb")) == NULL) {fprintf(stderr, "can't open %s\n", argv[1]);return -1;}if ((outfile = fopen(argv[2], "w")) == NULL) {fprintf(stderr, "can't open %s\n", argv[1]);return -1;}printf("size :%d\n",sizeof(struct jpeg_decompress_struct));//錯誤處理 回調函數 cinfo.err = jpeg_std_error(&jerr.pub);jerr.pub.error_exit = my_error_exit;if (setjmp(jerr.setjmp_buffer)) {printf("cinfo->err->msg_code :%d\n",cinfo.err->msg_code);jpeg_destroy_decompress(&cinfo);fclose(infile);fclose(outfile);return 0;}jpeg_create_decompress(&cinfo);jpeg_stdio_src(&cinfo, infile);// 用jpeg_read_header獲得jpg信息jpeg_read_header(&cinfo, TRUE);/* 源信息 */printf("image_width = %d\n", cinfo.image_width);printf("image_height = %d\n", cinfo.image_height);printf("num_components = %d\n", cinfo.num_components);// 設置解壓參數,比如放大、縮小cinfo.scale_num=1;cinfo.scale_denom=1;// 啟動解壓:jpeg_start_decompress jpeg_start_decompress(&cinfo);/* 輸出的圖象的信息 */printf("output_width = %d\n", cinfo.output_width);printf("output_height = %d\n", cinfo.output_height);printf("output_components = %d\n", cinfo.output_components);//解壓的是rgb,故為3元素// 一行的數據長度row_stride = cinfo.output_width * cinfo.output_components;buffer = malloc(row_stride);//分配空間用來存儲一行數據// 循環調用jpeg_read_scanlines來一行一行地獲得解壓的數據while (cinfo.output_scanline < cinfo.output_height) {(void) jpeg_read_scanlines(&cinfo, &buffer, 1);fwrite(buffer, row_stride, 1, outfile);}gettimeofday(&end, NULL);long timeuse = 1000000*(end.tv_sec - start.tv_sec) + end.tv_usec-start.tv_usec;printf("time =%ld\n", timeuse);free(buffer);fclose(infile);fclose(outfile);jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);return 0;
}
3.執行make,mkdir test && cp djpeg test && cd test && ./djpeg test.jpg test.rgb,效果如下
三、向其它平臺移植
????????適配不同交叉編譯器,cd build && cmake -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc .. ,其余步驟同上
總結
以上是生活随笔為你收集整理的LIBJPEG-TURBO库移植的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。