C++ JPEG编码解码
时间: 2023-06-14 22:06:50 浏览: 91
JPEG(Joint Photographic Experts Group)是一种非常常见的图像压缩格式。在C++中,可以使用开源的jpeglib库来进行JPEG图像的编码和解码。下面是一个简单的示例代码:
```
#include <stdio.h>
#include <jpeglib.h>
void encode_jpeg(const char* filename, unsigned char* image_buffer, int width, int height, int quality) {
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE* outfile;
JSAMPROW row_pointer[1];
int row_stride;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
if ((outfile = fopen(filename, "wb")) == NULL) {
fprintf(stderr, "Can't open %s\n", filename);
exit(1);
}
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = width;
cinfo.image_height = height;
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 = width * 3;
while (cinfo.next_scanline < cinfo.image_height) {
row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];
jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);
}
unsigned char* decode_jpeg(const char* filename, int* width, int* height) {
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE* infile;
unsigned char* buffer;
JSAMPARRAY buffer_array;
int row_stride;
if ((infile = fopen(filename, "rb")) == NULL) {
fprintf(stderr, "Can't open %s\n", filename);
exit(1);
}
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
*width = cinfo.output_width;
*height = cinfo.output_height;
int num_channels = cinfo.output_components;
buffer = (unsigned char*) malloc(*width * *height * num_channels);
buffer_array = (JSAMPARRAY) malloc(sizeof(JSAMPROW) * *height);
for (int i = 0; i < *height; i++) {
buffer_array[i] = & buffer[i * *width * num_channels];
}
row_stride = cinfo.output_width * cinfo.output_components;
while (cinfo.output_scanline < cinfo.output_height) {
jpeg_read_scanlines(&cinfo, &buffer_array[cinfo.output_scanline], 1);
}
jpeg_finish_decompress(&cinfo);
fclose(infile);
jpeg_destroy_decompress(&cinfo);
free(buffer_array);
return buffer;
}
int main() {
const char* filename = "test.jpg";
int width, height, quality = 80;
unsigned char* image_buffer;
// 编码
image_buffer = (unsigned char*) malloc(width * height * 3);
encode_jpeg(filename, image_buffer, width, height, quality);
// 解码
image_buffer = decode_jpeg(filename, &width, &height);
free(image_buffer);
return 0;
}
```
在上面的代码中,`encode_jpeg`函数用于对输入的RGB图像进行JPEG压缩编码,并将编码后的结果保存到指定的文件中。`decode_jpeg`函数用于对指定的JPEG文件进行解码,并返回解码后的RGB图像数据。在主函数中,我们首先调用`encode_jpeg`对指定的RGB图像进行编码,然后调用`decode_jpeg`对编码后的JPEG文件进行解码,最后释放图像数据的内存空间。