日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LIBJPEG-TURBO库移植

發布時間:2023/12/9 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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库移植的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。