gpt4 book ai didi

c++ - 在 C++ 中将简单的图像缓冲区保存为 png

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:21 25 4
gpt4 key购买 nike

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

最佳答案

libpng 有一个名为 Png++ 的 C++ 包装器。查一下here或者只是用谷歌搜索。

它们有一个真正的 C++ 接口(interface),带有模板等,在后台使用 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 中仍然缺少一些位(交错选项等),但坦率地说,我没有使用它们,所以对我来说没问题。

关于c++ - 在 C++ 中将简单的图像缓冲区保存为 png,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2287757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com