Как я могу получить данные пикселей из строки, используя libpng? - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь использовать библиотеку libpng для чтения и записи файла png.Я получил работу письма, но не могу заставить чтение работать.Я собираюсь загрузить все изображение в память для простоты, а затем пытаюсь проиндексировать каждую строку для доступа к данным.Это где моя проблема начинается.Я не могу найти в какой-либо документации информацию о том, сколько данных мне приходится перебирать, и как эти данные выкладываются.

Является ли каждые три числа пикселем (R, G, B)?

Я знаю, что для каждой строки существует более n номеров столбцов, если число байтов равно 600.

Вот мой код:

#include <png.h>
#include <stdio.h>

int main() {

    FILE *fp = fopen("example.png", "rb");
    if (!fp) {
        printf("There was something wrong with your file..\n");
        return 0;
    }

    int row = 0, width = 0, height = 0;     png_structp png_ptr = NULL;     png_infop info_ptr = NULL;

    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if(!png_ptr) {
        printf("There was something wrong with creating the read struct..\n");
        return 0;
    }

    info_ptr = png_create_info_struct(png_ptr);
    if(!info_ptr) {
        printf("There was something wrong with creating the info struct..\n");
        return 0;
    }

    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);

    png_bytep row_pointers[height];
    for (row = 0; row < height; row++)
        row_pointers[row] = NULL;

    for (row = 0; row < height; row++)
        row_pointers[row] = png_malloc(png_ptr, png_get_rowbytes(png_ptr,info_ptr));

    png_read_image(png_ptr, row_pointers);

    int number = 0;
    png_uint_32 rowbytes = png_get_rowbytes(png_ptr, info_ptr);
    printf("Number of bytes per row: %d\n", rowbytes);

    for (row = 0; row < height; row++) {
        for (int column = 0; column < width; column++) {
            printf("%d\n", row_pointers[0][column]);
        }
        printf("\n");
    }

    png_read_end(png_ptr, info_ptr);
    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
    fclose(fp);

    return 0; 

}

Спасибо.

...