将简单的图像缓冲区保存到C++中的png

hen*_*nle 5 c++ png

我想以平台独立的方式做到这一点,我知道libpng是可能的,但我发现很难弄清楚如何.有谁知道如何以简单的方式做到这一点?

Mat*_* M. 5

有一个C++包装器用于libpng调用Png++.在这里检查或只是谷歌.

他们有一个真正的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
Run Code Online (Sandbox Code Playgroud)

用法是这样的:

std::ostream& Png::write(std::ostream& out)
{
  PngGenerator aPng(_picture);
  aPng.write(out);
  return out;
}
Run Code Online (Sandbox Code Playgroud)

libpng(交错选项等)仍然缺少一些比特,但坦率地说我没有使用它们,所以对我来说没问题.

  • 我没有发现这美丽.怎么能被认为是美丽的?有人真的相信这是表示图像的正确方法吗?很抱歉使用这种煽动性语言,但编程中的任何内容都让我感到沮丧,因为处理PNG图像已经让人感到沮丧.为什么要让它变得更复杂? (9认同)