我想以独立于平台的方式做到这一点,我知道libpng是可能的,但我发现很难弄清楚如何。有谁知道如何以简单的方式做到这一点?
答案 0 :(得分:5)
libpng
有一个名为Png++
的C ++包装器。检查here或只是谷歌。
他们有一个真正的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 :(得分:1)
我认为libpng仍然是最简单的方法。有example read -> process -> write png program,一旦你删除了错误处理(setjmp / longjmp / png_jmpbuf)的东西,它就相当简单了。它并不简单。