Как прочитать метки из png файла в с++?

Пользователь

от jaren , в категории: C/C++ , 10 месяцев назад

Как прочитать метки из png файла в с++?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от fred , 10 месяцев назад

@jaren 

В C++ есть несколько способов прочитать метки из PNG файла. Один из самых популярных способов - использовать библиотеку libpng.


Вот пример кода, демонстрирующий, как прочитать метки из PNG файла с использованием библиотеки libpng:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include 
#include 
#include 

// Функция для получения ошибки libpng и ее вывода
void ErrorCallback(png_structp pngStruct, png_const_charp errorMesg) {
    std::cerr << "Error reading PNG file: " << errorMesg << std::endl;
    longjmp(png_jmpbuf(pngStruct), 1);
}

int main() {
    // Открываем файл PNG для чтения
    FILE* file = fopen("example.png", "rb");
    if (!file) {
        std::cerr << "Unable to open PNG file." << std::endl;
        return 1;
    }

    // Инициализируем структуру png_struct для чтения PNG файла и устанавливаем функцию обратного вызова для обработки ошибок
    png_structp pngStruct = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, ErrorCallback, NULL);
    if (!pngStruct) {
        std::cerr << "Error creating read struct." << std::endl;
        fclose(file);
        return 1;
    }

    // Инициализируем структуру png_info для чтения метаданных PNG файла
    png_infop pngInfo = png_create_info_struct(pngStruct);
    if (!pngInfo) {
        std::cerr << "Error creating info struct." << std::endl;
        fclose(file);
        png_destroy_read_struct(&pngStruct, NULL, NULL);
        return 1;
    }

    // Устанавливаем ошибки в png_struct при использовании longjmp
    if (setjmp(png_jmpbuf(pngStruct))) {
        std::cerr << "Error during PNG reading." << std::endl;
        fclose(file);
        png_destroy_read_struct(&pngStruct, &pngInfo, NULL);
        return 1;
    }

    // Устанавливаем источник чтения
    png_init_io(pngStruct, file);

    // Читаем заголовок PNG файла
    png_read_info(pngStruct, pngInfo);

    // Получаем информацию о метках из заголовка PNG файла
    png_textp pngText;
    int numText;
    png_get_text(pngStruct, pngInfo, &pngText, &numText);

    // Выводим метки
    for (int i = 0; i < numText; i++) {
        std::cout << "Keyword: " << pngText[i].key << std::endl;
        std::cout << "Text: " << pngText[i].text << std::endl;
        std::cout << "-----------------------------" << std::endl;
    }

    // Закрываем файл и освобождаем ресурсы
    fclose(file);
    png_destroy_read_struct(&pngStruct, &pngInfo, NULL);

    return 0;
}


В приведенном выше коде предполагается, что файл "example.png" находится в том же каталоге, что и исполняемый файл программы. Однако, это может быть изменено на путь к вашему PNG файлу.


Код использует библиотеку libpng для чтения метаданных PNG файла. Функция ErrorCallback используется для обработки ошибок, если они возникают во время чтения PNG файла.


После успешного чтения PNG заголовка, код получает информацию о метках с помощью функции png_get_text и выводит на экран полученные метки.