一、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