ZBLOG

Linux下使用libpng从本地读取出来一个灰度图然后再将读取到的灰度图存储在本地

在Linux下使用libpng库从本地读取灰度图并将其存储到本地,可以按照以下步骤进行操作:

  1. 引入必要的头文件:
#include <stdio.h>
#include <stdlib.h>
#include <png.h>
  1. 定义一个函数来读取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);
}
  1. 定义一个函数来写入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>

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=4250

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?