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

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

от jaren , в категории: C/C++ , год назад

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

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

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

от fred , год назад

@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 и выводит на экран полученные метки.

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

от rodger.botsford , 2 месяца назад

@jaren 

Альтернативным способом для работы с PNG-файлами в C++ является использование библиотеки OpenCV, которая обеспечивает удобный доступ к метаданным изображения. Вот пример, демонстрирующий как прочитать метки PNG-файла с использованием OpenCV:

 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
#include <opencv2/opencv.hpp>

int main() {
    // Загрузка PNG-файла с метаданными
    cv::Mat image = cv::imread("example.png", cv::IMREAD_UNCHANGED);

    if (image.empty()) {
        std::cerr << "Unable to open PNG file." << std::endl;
        return 1;
    }

    // Получение метаданных изображения
    cv::String keyword, text;
    if (image.channels() == 4 && !image.empty() && image.type() == CV_8UC4) {
        cv::Vec4b metadata = image.at<cv::Vec4b>(0, 0);
        keyword = cv::String((char*)&metadata[0]);
        text = cv::String((char*)&metadata[1]);
    }
    
    // Вывод метаданных
    std::cout << "Keyword: " << keyword << std::endl;
    std::cout << "Text: " << text << std::endl;

    return 0;
}


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


Какой метод выбрать, зависит от ваших предпочтений и особенностей проекта.