C++ jpg转png 代码
时间: 2023-08-31 16:12:52 浏览: 334
test_code.tar.gz
这里提供一种 C 语言实现 jpg 转 png 的方法,需要使用第三方库 libjpeg 和 libpng。
首先,我们需要安装 libjpeg 和 libpng 库,可以使用以下命令进行安装:
```
sudo apt-get install libjpeg-dev libpng-dev
```
然后,我们可以使用以下代码实现 jpg 转 png:
```c
#include <stdio.h>
#include <stdlib.h>
#include <jpeglib.h>
#include <png.h>
void write_png_file(char *filename, int width, int height, char *data) {
FILE *fp = fopen(filename, "wb");
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_infop info_ptr = png_create_info_struct(png_ptr);
png_init_io(png_ptr, fp);
png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, 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) * height);
for (int y = 0; y < height; y++) {
row_pointers[y] = (png_bytep)(data + y * width * 3);
}
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, NULL);
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
free(row_pointers);
}
void jpg_to_png(char *jpg_filename, char *png_filename) {
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE *infile = fopen(jpg_filename, "rb");
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
int width = cinfo.output_width;
int height = cinfo.output_height;
int row_stride = width * cinfo.output_components;
char *data = (char*)malloc(row_stride * height);
while (cinfo.output_scanline < cinfo.output_height) {
char *row_pointer = data + (cinfo.output_scanline) * row_stride;
jpeg_read_scanlines(&cinfo, (JSAMPLE **)&row_pointer, 1);
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(infile);
write_png_file(png_filename, width, height, data);
free(data);
}
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s input.jpg output.png\n", argv[0]);
return 1;
}
jpg_to_png(argv[1], argv[2]);
return 0;
}
```
上述代码中,`write_png_file()` 函数用于将像素数据写入 png 文件,`jpg_to_png()` 函数用于将 jpg 文件转换为 png 文件,`main()` 函数接受命令行参数并调用 `jpg_to_png()` 函数进行转换。注意,本示例代码仅支持 RGB 彩色 jpg 文件转换为 RGB 彩色 png 文件。
使用以下命令编译代码:
```
gcc -o jpg2png jpg2png.c -ljpeg -lpng
```
其中,`-ljpeg` 和 `-lpng` 参数指定链接 libjpeg 和 libpng 库。
使用以下命令运行代码:
```
./jpg2png input.jpg output.png
```
其中,`input.jpg` 是需要转换的 jpg 文件,`output.png` 是转换后的 png 文件。
阅读全文