Простая оболочка PNG, которая работает.У кого-нибудь есть фрагмент, которым можно поделиться? - PullRequest
4 голосов
/ 06 февраля 2012

Я ищу способ получить буфер данных изображения в файл PNG и способ получить файл PNG в буфер.

Есть только две вещи, которые я хочу сделать.

Это была бы просто мертвая оболочка, которая использует png.h.Ну, не совсем просто из-за ужасно сложного API-интерфейса libpng, но его концепция такова.

Я пробовал DevIL раньше.Это намного проще в использовании, чем libpng.Тем не менее, у меня было проблем с ним.Кроме того, DevIL слишком много .Мне нужна только бережливость и поддержка базового формата PNG, а не 20 других форматов.

Тогда я нахожу эту страницу .Я похвалил Pixel Fairy и Всемогущего Google за то, что они дали мне реализацию на серебряном блюде ... Тогда получается, что это искажает изображение: в обработанном изображении пропадает каждый четвертый пиксель в каждой линии сканирования.Я вполне уверен, прочитав источник, что это не должно произойти!Он должен обнулить красный и установить зеленый на синий.Этого тоже не случилось.

Я также пробовал png ++.Проблема, с которой я столкнулся, заключается в том, что я не мог получить данные из PNG в формате, совместимом для загрузки в OpenGL, мне пришлось бы создать еще один буфер.Это выглядело некрасиво, но я обязательно попробую png ++ еще раз, прежде чем даже подумать о том, чтобы дать DevIL еще один шанс.Потому что png ++ работал, по крайней мере.Это также имеет аспект только заголовка, идущий на это.Тем не менее, он выдал кучу предупреждений компилятора.

Есть ли другие претенденты?Любой, кто работал с непосредственным использованием libpng, знал бы, как сделать то, что я запрашиваю: одну функцию, которая берет имя файла и заполняет 32-битный буфер и устанавливает два целых числа разрешения;одна функция, которая принимает 32-битный буфер, два целых числа разрешения и имя файла.

Обновление-редактирование: я нашел это .Может быть что-то там.

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Этот учебник , кажется, имеет то, что вы хотите.

По ссылке:

 //Here's one of the pointers we've defined in the error handler section:
    //Array of row pointers. One for every row.
    rowPtrs = new png_bytep[imgHeight];

    //Alocate a buffer with enough space.
    //(Don't use the stack, these blocks get big easilly)
    //This pointer was also defined in the error handling section, so we can clean it up on error.
    data = new char[imgWidth * imgHeight * bitdepth * channels / 8];
    //This is the length in bytes, of one row.
    const unsigned int stride = imgWidth * bitdepth * channels / 8;

    //A little for-loop here to set all the row pointers to the starting
    //Adresses for every row in the buffer

    for (size_t i = 0; i < imgHeight; i++) {
        //Set the pointer to the data pointer + i times the row stride.
        //Notice that the row order is reversed with q.
        //This is how at least OpenGL expects it,
        //and how many other image loaders present the data.
        png_uint_32 q = (imgHeight- i - 1) * stride;
        rowPtrs[i] = (png_bytep)data + q;
    }

    //And here it is! The actuall reading of the image!
    //Read the imagedata and write it to the adresses pointed to
    //by rowptrs (in other words: our image databuffer)
    png_read_image(pngPtr, rowPtrs);
1 голос
/ 29 июля 2015

Я бы добавил CImg в список опций.Хотя это библиотека изображений, API не такой высокий уровень, как большинство (devil / imagemagick / freeimage / GIL).Это также только заголовок.

Класс изображения имеет простую высоту ширины и элементы данных с открытым доступом.Под капотом он использует libpng (если вы скажете это с помощью директивы препроцессора).Данные приводятся к любому типу, который вы выбрали для объекта шаблона изображения.

CImg<uint8_t>myRGBA("fname.png");
myRGBA._data[0] = 255; //set red value of first pixel
1 голос
/ 06 февраля 2012

Шон Барретт написал два файла общественного достояния для изображения PNG чтение / запись .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...