Сохранение простого буфера изображения в png в C ++ - PullRequest
5 голосов
/ 18 февраля 2010

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

Ответы [ 2 ]

5 голосов
/ 18 февраля 2010

Существует оболочка C ++ для libpng, которая называется Png++. Проверьте это здесь или просто Google.

Они имеют настоящий интерфейс C ++ с шаблонами и такими, которые используют libpng под капотом. Я нашел код, который я написал, довольно выразительный и высокоуровневый.

Пример «генератора», который является сердцем алгоритма:

class PngGenerator : public png::generator< png::gray_pixel_1, PngGenerator>
{
  typedef png::generator< png::gray_pixel_1, PngGenerator> base_t;
public:
  typedef std::vector<char> line_t;
  typedef std::vector<line_t> picture_t;

  PngGenerator(const picture_t& iPicture) :
    base_t(iPicture.front().size(), iPicture.size()),
    _picture(iPicture), _row(iPicture.front().size())
  {
  } // PngGenerator

  png::byte* get_next_row(size_t pos)
  {
    const line_t& aLine = _picture[pos];

    for(size_t i(0), max(aLine.size()); i < max; ++i)
      _row[i] = pixel_t(aLine[i] == Png::White_256);
         // Pixel value can be either 0 or 1
         // 0: Black, 1: White

    return row_traits::get_data(_row);
  } // get_next_row

private:
  // To be transformed
  const picture_t& _picture;

  // Into
  typedef png::gray_pixel_1 pixel_t;
  typedef png::packed_pixel_row< pixel_t > row_t;
  typedef png::row_traits< row_t > row_traits;
  row_t _row; // Buffer
}; // class PngGenerator

И использование так:

std::ostream& Png::write(std::ostream& out)
{
  PngGenerator aPng(_picture);
  aPng.write(out);
  return out;
}

В libpng все еще не хватает некоторых битов (варианты чередования и тому подобное), но, честно говоря, я ими не пользовался, поэтому мне было хорошо.

1 голос
/ 18 февраля 2010

Я бы сказал, что libpng по-прежнему самый простой способ. Есть пример read -> process -> write png program , это довольно просто, когда вы убираете вещи обработки ошибок (setjmp / longjmp / png_jmpbuf). Это не становится проще, чем это.

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