littlebot
Published on 2025-04-09 / 1 Visits
0

【源码】基于C++语言的JPEG图像编解码系统

项目简介

本项目是轻量级的JPEG图像编解码解决方案,由 jpge.cpp 实现JPEG图像压缩功能,jpgd.cpp 实现JPEG图像解压缩功能。代码量约1000行,使用简单,可选择公共领域或Apache 2.0许可证。该项目支持多种色度子采样因子、Libjpeg兼容的质量设置,内存消耗低且速度合理。此外,还提供了示例命令行工具和VS2019解决方案,支持CMake编译。

项目的主要特性和功能

压缩功能

  • 支持灰度和H1V1/H2V1/H2V2色度子采样因子。
  • 支持Libjpeg兼容的质量设置。
  • 支持单遍和两遍霍夫曼编码。
  • 仅进行一次动态内存分配。
  • 接受32位源图像。

解压缩功能

  • 支持渐进式图像解压缩。
  • 支持盒式和线性色度上采样。
  • 支持灰度或H1V1/H2V1/H1V2/H2V2色度上采样因子。
  • 经模糊测试,对意外或故意损坏的输入有弹性。
  • 无需将整个图像加载到内存,一次仅处理单个MCU行。

其他特性

  • 提供命令行工具 jpge.exe,支持多种格式图像转基线JPEG。
  • 支持用SSE2加速,可通过宏控制。

安装使用步骤

安装

假设用户已下载本项目源码文件。若使用VS2019,可直接打开项目中的VS2019解决方案编译;若使用gcc/clang,可使用项目中的 CMakeLists.txt 文件编译。

使用

压缩

  1. 包含头文件 jpge.h
  2. 调用 jpge 命名空间中的辅助函数,如: cpp // 写入JPEG图像到文件 bool compress_image_to_jpeg_file(const char *pFilename, int width, int height, int num_channels, const uint8 *pImage_data, const params &comp_params = params()); // 写入JPEG图像到内存缓冲区 bool compress_image_to_jpeg_file_in_memory(void *pBuf, int &buf_size, int width, int height, int num_channels, const uint8 *pImage_data, const params &comp_params = params()); 也可直接调用 jpge::jpeg_encoder 类获更多控制权。

解压缩

  1. 包含头文件 jpgd.h
  2. 调用 jpgd 命名空间中的辅助函数,如: cpp // 从内存缓冲区加载JPEG图像 unsigned char *decompress_jpeg_image_from_memory(const unsigned char *pSrc_data, int src_data_size, int *width, int *height, int *actual_comps, int req_comps, uint32_t flags = 0); // 从文件加载JPEG图像 unsigned char *decompress_jpeg_image_from_file(const char *pSrc_filename, int *width, int *height, int *actual_comps, int req_comps, uint32_t flags = 0); 同样,可直接使用 jpgd::jpeg_decompressor 类或调用 decompress_jpeg_image_from_stream() 函数获更多控制权。

测试

使用命令行工具 jpge.exe 测试,用法如下: bin/jpge source_file.png destination_file.jpg quality_factor 其中 quality_factor 范围为1 - 100,值越高质量越好。此外,jpge.exe 还支持其他测试模式,可通过 -x 选项进行详尽测试,通过 -d 选项进行JPEG到TGA的解压缩。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】