在Linux下使用libpng库从本地读取灰度图并将其存储到本地,可以按照以下步骤进行操作:
- 引入必要的头文件:
#include <stdio.h>
#include <stdlib.h>
#include <png.h>
- 定义一个函数来读取PNG文件:
void read_png_file(const char* filename, int* width, int* height, png_byte** image_data) {
FILE *fp = fopen(filename, "rb");
if (!fp) {
fprintf(stderr, "Error opening file %s\n", filename);
return;
}
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
fclose(fp);
fprintf(stderr, "Error creating PNG read struct\n");
return;
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
fclose(fp);
png_destroy_read_struct(&png_ptr, NULL, NULL);
fprintf(stderr, "Error creating PNG info struct\n");
return;
}
if (setjmp(png_jmpbuf(png_ptr))) {
fclose(fp);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fprintf(stderr, "Error during PNG read: longjmp error\n");
return;
}
png_init_io(png_ptr, fp);
png_read_info(png_ptr, info_ptr);
*width = png_get_image_width(png_ptr, info_ptr);
*height = png_get_image_height(png_ptr, info_ptr);
int color_type = png_get_color_type(png_ptr, info_ptr);
// 确保图像是灰度图像(如有需要,可以添加相应的错误处理逻辑)
if (color_type != PNG_COLOR_TYPE_GRAY) {
fclose(fp);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fprintf(stderr, "Error: Input image is not grayscale\n");
return;
}
int bit_depth = png_get_bit_depth(png_ptr, info_ptr);
// 确保图像的位深度为8(如有需要,可以添加相应的错误处理逻辑)
if (bit_depth != 8) {
fclose(fp);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fprintf(stderr, "Error: Input image does not have 8 bits per sample\n");
return;
}
png_bytep* row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * (*height));
for (int y = 0; y < (*height); ++y) {
row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png_ptr, info_ptr));
}
png_read_image(png_ptr, row_pointers);
*image_data = (png_byte*)malloc((*width) * (*height));
// 将图像数据复制到image_data中
for (int y = 0; y < (*height); ++y) {
memcpy(*image_data + ((*width) * y), row_pointers[y], (*width));
}
// 清理内存和关闭文件
for (int y = 0; y < (*height); ++y) {
free(row_pointers[y]);
}
free(row_pointers);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(fp);
}
- 定义一个函数来写入PNG文件:
”`c void write_png_file(const char* filename, int width, int height, const png_byte* image_data) {
FILE *fp = fopen(filename, "wb");
if (!fp) {
fprintf(stderr, "Error opening file %s\n", filename);
return;
}
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_ptr) {
fclose(fp);
fprintf(stderr, "Error creating PNG write struct\n");
return;
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {
fclose(fp);
png_destroy_write_struct(&png_ptr, NULL);
fprintf(stderr, "Error creating PNG info struct\n");
return;
}
if (setjmp(png_jmpbuf(png_ptr))) {
fclose(fp);
png_destroy_write_struct(&png_ptr, &info_ptr);
fprintf(stderr, "Error during PNG write: longjmp error\n");
<br/><br/><br/><font size=1 color=#CCCCCC>内容由零声教学AI助手提供,问题来源于学员提问</font>