我想以平臺獨立的方式做到這一點,我知道libpng是一種可能性,但我很難弄清楚如何。有誰知道如何以簡單的方式做到這一點?在C++中保存一個簡單的圖像緩衝區爲PNG
回答
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
人仍下落不明(交錯的選擇和這樣的),但坦率地說,我沒有使用它們,所以對我來說沒問題。
這很美!謝謝! – henle 2010-02-18 17:32:55
我不覺得這美麗。這怎麼可以被認爲是美麗的?有沒有人真的相信這是代表圖像的正確方法?對不起,使用這種煽動性語言,但編程沒有讓我感到沮喪,處理PNG圖像。爲什麼使它比它更復雜? – 2012-02-06 04:43:27
我會說libpng仍然是最簡單的方法。有example read -> process -> write png program,這是相當簡單的,一旦你去除錯誤處理(setjmp/longjmp/png_jmpbuf)的東西。這並不簡單。
是的,我看到了。我必須說,我很困惑,但現在,你告訴我,它很簡單,它確實是;) – henle 2010-02-18 14:00:24
- 1. 在緩衝區中讀取一個PNG圖像
- 2. 將圖像保存到緩衝區
- 3. 將圖像緩衝區保存爲位圖圖像
- 4. 插入圖像到幀緩衝區並寫幀緩衝到png
- 5. 將32位RGBA緩衝區保存爲.png文件(Cocoa OSX)
- 6. C++簡單循環緩衝區隊列
- 7. C簡單緩衝區溢出
- 8. 一個簡單的頂點緩衝區對象(C++),不渲染
- 9. C++簡單圖像衝突
- 10. 在PNG中將圖像保存爲RGBA8
- 11. Ruby on Rails:兩個視圖,一個保存緩衝區
- 12. 如何將旋轉的緩衝圖像保存在另一個緩衝圖像中?
- 13. 在char []緩衝區中保存double值
- 14. 將圖形保存到緩衝圖像
- 15. 如何確保一個緩衝區存儲在緩存中的手臂9
- 16. OpenCL中的緩衝區對象和圖像緩衝區對象
- 17. DataOutputStream內部保存整個緩衝區?
- 18. Recv環形緩衝區vs簡單緩衝區
- 19. 只緩存一個帶有「.htaccess」而不是所有圖像(.png)的圖像(.png)?
- 20. HTML5圖像緩衝區
- 21. 的memcpy從一個char *緩衝區一個wchar_t的*緩衝區
- 22. 將char *緩衝區顯示爲圖像
- 23. 發送緩衝區爲真實圖像
- 24. Android/Java簡單的FiFO緩衝區
- 25. 保存一個緩衝圖像,減少壓縮
- 26. 編寫一個緩衝圖像緩存並將其保存到磁盤
- 27. 保存爲PNG格式的DICOM圖像
- 28. turbojpeg cpp中的realloc圖像緩衝區
- 29. 將兩個YV12圖像緩衝區合併爲一個並排圖像
- 30. 在緩衝區菜單中選擇不同的緩衝區
您可以使用[Imagemagick](http://www.imagemagick.org/script/index.php),但它也有其他一些功能。 – 2010-02-18 10:37:29