c语言实现图片压缩函数
时间: 2023-08-17 09:54:48 浏览: 394
图像压缩 c语言
3星 · 编辑精心推荐
在C语言中,可以使用各种算法来实现图片压缩函数。其中,常用的算法包括JPEG压缩和PNG压缩。
1. JPEG压缩:JPEG(Joint Photographic Experts Group)是一种广泛应用于图像压缩的算法。在C语言中,可以使用libjpeg库来实现JPEG压缩。首先,你需要安装libjpeg库,并包含相应的头文件:
```c
#include <stdio.h>
#include <jpeglib.h>
```
然后,可以使用以下代码片段来压缩图片:
```c
void compress_image(const char* input_image, const char* output_image, int quality) {
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE* infile, *outfile;
JSAMPROW row_pointer[1];
int row_stride;
if ((infile = fopen(input_image, "rb")) == NULL) {
fprintf(stderr, "Can't open %s\n", input_image);
return;
}
if ((outfile = fopen(output_image, "wb")) == NULL) {
fprintf(stderr, "Can't create %s\n", output_image);
fclose(infile);
return;
}
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);
jpeg_read_header(&cinfo, TRUE);
cinfo.image_quality = quality;
jpeg_start_compress(&cinfo, TRUE);
row_stride = cinfo.image_width * cinfo.input_components;
unsigned char* buffer = (unsigned char*)malloc(row_stride);
while (cinfo.next_scanline < cinfo.image_height) {
row_pointer[0] = &buffer[cinfo.next_scanline * row_stride];
jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
free(buffer);
jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);
fclose(infile);
}
```
上述代码中,`compress_image`函数接受输入图片路径、输出图片路径和压缩质量作为参数。它使用libjpeg库中的函数来进行图片压缩,并将压缩后的图片保存到指定路径。
2. PNG压缩:PNG(Portable Network Graphics)是一种无损的图像压缩格式。在C语言中,可以使用libpng库来实现PNG压缩。首先,你需要安装libpng库,并包含相应的头文件:
```c
#include <stdio.h>
#include <stdlib.h>
#include <png.h>
```
然后,可以使用以下代码片段来压缩图片:
```c
void compress_image(const char* input_image, const char* output_image) {
FILE* infile = fopen(input_image, "rb");
if (!infile) {
fprintf(stderr, "Can't open %s\n", input_image);
return;
}
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
fclose(infile);
fprintf(stderr, "png_create_write_struct failed\n");
return;
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
fclose(infile);
png_destroy_write_struct(&png_ptr, NULL);
fprintf(stderr, "png_create_info_struct failed\n");
return;
}
if (setjmp(png_jmpbuf(png_ptr))) {
fclose(infile);
png_destroy_write_struct(&png_ptr, &info_ptr);
fprintf(stderr, "Error during png creation\n");
return;
}
png_init_io(png_ptr, infile);
png_read_info(png_ptr, info_ptr);
png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
png_set_compression_strategy(png_ptr, Z_DEFAULT_STRATEGY);
png_set_compression_mem_level(png_ptr, 8);
png_set_compression_window_bits(png_ptr, 15);
FILE* outfile = fopen(output_image, "wb");
if (!outfile) {
fclose(infile);
png_destroy_write_struct(&png_ptr, &info_ptr);
fprintf(stderr, "Can't create %s\n", output_image);
return;
}
png_set_write_fn(png_ptr, outfile, NULL, NULL);
png_set_IHDR(png_ptr, info_ptr, png_get_image_width(png_ptr, info_ptr), png_get_image_height(png_ptr, info_ptr),
png_get_bit_depth(png_ptr, info_ptr), PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
png_write_info(png_ptr, info_ptr);
png_bytep* row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * png_get_image_height(png_ptr, info_ptr));
for (int y = 0; y < png_get_image_height(png_ptr, info_ptr); y++) {
row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png_ptr, info_ptr));
}
png_read_image(png_ptr, row_pointers);
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, NULL);
fclose(infile);
fclose(outfile);
png_destroy_write_struct(&png_ptr, &info_ptr);
for (int y = 0; y < png_get_image_height(png_ptr, info_ptr); y++) {
free(row_pointers[y]);
}
free(row_pointers);
}
```
上述代码中,`compress_image`函数接受输入图片路径和输出图片路径作为参数。它使用libpng库中的函数来进行图片压缩,并将压缩后的图片保存到指定路径。
以上是两种常用的图片压缩算法在C语言中的实现方法。你可以根据自己的需求选择其中一种算法来实现图片压缩函数。
阅读全文