高效圖像壓縮:libjpeg-turbo的應用與優勢

一、libjpeg-turbo簡介

libjpeg-turbo是一個基於libjpeg的高性能JPEG壓縮庫,它在壓縮率與速度之間做了平衡,並取得了非常不錯的效果。它採用了SIMD指令集,通過使用從x86、MIPS和ARM架構中挑選出的最優指令,進一步提高了執行效率。

接下來,我們將通過一個代碼示例來體驗它的壓縮速度與壓縮率。

#include 
#include 

void compress(const char *filename_in, const char *filename_out, int quality) {
    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr jerr;
    JSAMPROW row_pointer[1];
    int row_stride;
    FILE *infile = fopen(filename_in, "rb");
    unsigned char *buffer;
    if (!infile) {
        printf("can't open %s\n", filename_in);
        return;
    }
    buffer = (unsigned char *)malloc(1 << 20); // 1MB
    if (!buffer) {
        printf("not enough memory\n");
        fclose(infile);
        return;
    }
    fseek(infile, 0, SEEK_END);
    size_t file_size = ftell(infile);
    fseek(infile, 0, SEEK_SET);
    fread(buffer, 1, file_size, infile);
    fclose(infile);

    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
    FILE *outfile = fopen(filename_out, "wb");
    if (!outfile) {
        printf("can't open %s\n", filename_out);
        jpeg_destroy_compress(&cinfo);
        return;
    }
    jpeg_stdio_dest(&cinfo, outfile);

    cinfo.image_width = 3840;
    cinfo.image_height = 2160;
    cinfo.input_components = 3;
    cinfo.in_color_space = JCS_RGB;
    jpeg_set_defaults(&cinfo);
    jpeg_set_quality(&cinfo, quality, TRUE);
    jpeg_start_compress(&cinfo, TRUE);

    row_stride = cinfo.image_width * 3;
    while (cinfo.next_scanline < cinfo.image_height) {
      row_pointer[0] = & buffer[cinfo.next_scanline * row_stride];
      jpeg_write_scanlines(&cinfo, row_pointer, 1);
    }

    jpeg_finish_compress(&cinfo);
    fclose(outfile);
    jpeg_destroy_compress(&cinfo);
    printf("%s compressed to %s (quality=%d)\n", filename_in, filename_out, quality);
}

int main(int argc, char *argv[]) {
    compress("test.jpg", "test_compressed.jpg", 80);
    return 0;
}

在上面這段代碼中,我們定義了一個名為compress的函數用於壓縮JPEG文件。我們調用該函數時需要提供三個參數:輸入文件名、輸出文件名和壓縮質量。其中,輸入文件名指的是需要壓縮的JPEG圖片,輸出文件名指的是壓縮完成後的JPEG圖片,壓縮質量則是一個0~100的整數,0表示壓縮質量最差,100表示壓縮質量最好。

在上述示例代碼中,我們將一張分辨率為3840×2160的JPEG圖片進行了80%的壓縮,並輸出到了另一個文件中。當然,我們可以對比不同的壓縮質量所獲得的壓縮率和壓縮時間,以便更好地權衡壓縮質量與速度。

二、libjpeg-turbo的優勢

那麼,為什麼應該選擇使用libjpeg-turbo呢?首先,它顯著提高了壓縮速度,這使得它成為了許多應用場景下的首選。此外,它還允許用戶選擇更高的壓縮率,使得壓縮後的圖片質量更高。

應用libjpeg-turbo還有一個優勢,那就是它可以支持許多操作系統和平台,包括Linux、Windows、Mac OS X和Android等。

下面這段代碼演示了如何在Android平台上使用libjpeg-turbo:

#include 
#include 
#include 

#define LOG_TAG "libjpeg-turbo"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

void compress(const char *filename_in, const char *filename_out, int quality) {
    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr jerr;
    JSAMPROW row_pointer[1];
    int row_stride;
    FILE *infile = fopen(filename_in, "rb");
    unsigned char *buffer;
    if (!infile) {
        LOGE("can't open %s", filename_in);
        return;
    }
    buffer = (unsigned char *)malloc(1 << 20); // 1MB
    if (!buffer) {
        LOGE("not enough memory");
        fclose(infile);
        return;
    }
    fseek(infile, 0, SEEK_END);
    size_t file_size = ftell(infile);
    fseek(infile, 0, SEEK_SET);
    fread(buffer, 1, file_size, infile);
    fclose(infile);

    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
    FILE *outfile = fopen(filename_out, "wb");
    if (!outfile) {
        LOGE("can't open %s", filename_out);
        jpeg_destroy_compress(&cinfo);
        return;
    }
    jpeg_stdio_dest(&cinfo, outfile);

    cinfo.image_width = 3840;
    cinfo.image_height = 2160;
    cinfo.input_components = 3;
    cinfo.in_color_space = JCS_RGB;
    jpeg_set_defaults(&cinfo);
    jpeg_set_quality(&cinfo, quality, TRUE);
    jpeg_start_compress(&cinfo, TRUE);

    row_stride = cinfo.image_width * 3;
    while (cinfo.next_scanline < cinfo.image_height) {
      row_pointer[0] = & buffer[cinfo.next_scanline * row_stride];
      jpeg_write_scanlines(&cinfo, row_pointer, 1);
    }

    jpeg_finish_compress(&cinfo);
    fclose(outfile);
    jpeg_destroy_compress(&cinfo);
    LOGI("%s compressed to %s (quality=%d)", filename_in, filename_out, quality);
}

int main(int argc, char *argv[]) {
    // 在Android平台上,可以使用以下代碼來獲取應用的路徑
    // 並將要壓縮的圖片路徑拼接上去

    char *path_to_image = "/data/data/com.example.myapp/files/test.jpg";
    char *path_to_compressed_image = "/data/data/com.example.myapp/files/test_compressed.jpg";

    int quality = 80; // 壓縮質量

    compress(path_to_image, path_to_compressed_image, quality);
    return 0;
}

上述示例代碼展示了在Android平台上使用libjpeg-turbo進行圖片壓縮的方法。通過使用ANRDOID_LOG_INFO和ANDROID_LOG_ERROR宏來輸出調試信息,我們可以更方便地確定在壓縮過程中可能出現的問題所在。

三、總結

本文中,我們詳細闡述了libjpeg-turbo的應用與優勢,並且通過代碼示例演示了如何使用libjpeg-turbo進行高效的圖像壓縮。同時,我們還探討了如何在不同的操作系統和平台上使用libjpeg-turbo。相信這些內容對於開發者們的圖像處理工作有所幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/155185.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-17 02:39
下一篇 2024-11-17 02:39

相關推薦

  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • 程序化建模的優勢和劣勢

    程序化建模是指通過計算機編製程序實現對各種複雜系統的建模和仿真過程。隨着計算機技術和計算能力的不斷提高,程序化建模在眾多領域得到了廣泛應用,例如計算機輔助設計、製造、仿真、數據分析…

    編程 2025-04-29
  • Python圖像黑白反轉用法介紹

    本文將從多個方面詳細闡述Python圖像黑白反轉的方法和技巧。 一、Pillow模塊介紹 Pillow是Python的一個圖像處理模塊,可以進行圖片的裁剪、旋轉、縮放等操作。使用P…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Matlab二值圖像全面解析

    本文將全面介紹Matlab二值圖像的相關知識,包括二值圖像的基本原理、如何對二值圖像進行處理、如何從二值圖像中提取信息等等。通過本文的學習,你將能夠掌握Matlab二值圖像的基本操…

    編程 2025-04-28
  • Trocket:打造高效可靠的遠程控制工具

    如何使用trocket打造高效可靠的遠程控制工具?本文將從以下幾個方面進行詳細的闡述。 一、安裝和使用trocket trocket是一個基於Python實現的遠程控制工具,使用時…

    編程 2025-04-28
  • Python在線編輯器的優勢與實現方式

    Python在線編輯器是Python語言愛好者的重要工具之一,它可以讓用戶方便快捷的在線編碼、調試和分享代碼,無需在本地安裝Python環境。本文將從多個方面對Python在線編輯…

    編程 2025-04-28
  • Python實現圖像轉化為灰度圖像

    本文將從多個方面詳細闡述如何使用Python將圖像轉化為灰度圖像,包括圖像的概念、灰度圖像的概念、Python庫的使用以及完整的Python代碼實現。 一、圖像與灰度圖像 圖像是指…

    編程 2025-04-28
  • 開源Python CMS的優勢和應用範圍

    開源Python CMS是一種基於Python架構的內容管理系統。它不僅具有高效可靠的核心框架,還有大量的插件和現成的模板,可以充分滿足各種網站需求,使開發人員輕鬆地進行網站設計和…

    編程 2025-04-28

發表回復

登錄後才能評論