目前我有一個ray-tracing program產生浮點(從0到1)或short
值(從0到255)的RGB值。 (相關代碼在ImageTools.cpp和ImageTools.hpp。)如何將原始圖像數據保存到PNG圖像?
目前我可以通過編寫PPM,這是可怕的龐大和臃腫產生圖像。
如何從這些數組中的一個寫入PNG圖像?
我更喜歡不添加對大多數Linux系統上不常安裝的任何內容的依賴,因爲我迄今爲止依賴於0。
目前我有一個ray-tracing program產生浮點(從0到1)或short
值(從0到255)的RGB值。 (相關代碼在ImageTools.cpp和ImageTools.hpp。)如何將原始圖像數據保存到PNG圖像?
目前我可以通過編寫PPM,這是可怕的龐大和臃腫產生圖像。
如何從這些數組中的一個寫入PNG圖像?
我更喜歡不添加對大多數Linux系統上不常安裝的任何內容的依賴,因爲我迄今爲止依賴於0。
你可以使用Boost GIL
如果您有原始圖像數據(或可產生以某種方式):
unsigned char r[width * height]; // red
unsigned char g[width * height]; // green
unsigned char b[width * height]; // blue
您可以用這種方法寫一個PNG文件:
#include <boost/gil/extension/io/png_io.hpp>
boost::gil::rgb8c_planar_view_t view = boost::gil::planar_rgb_view(width, height, r, g, b, width);
boost::gil::png_write_view("out.png", view);
如果圖片還包含alpha通道
unsigned char a[width * height];
然後
#include <boost/gil/extension/io/png_io.hpp>
boost::gil::rgba8c_planar_view_t view = boost::gil::planar_rgba_view(width, height, r, g, b, a, width);
boost::gil::png_write_view("out.png", view);
記住你的程序與-lpng
想要簡單的解決方案,謝謝 –
我假設你不想自己實現這個標準,因此願意通過在你的項目中引入一些依賴來妥協。如果是這樣,libpng通常安裝在大多數Linux系統上。 http://www.libpng.org/pub/png/libpng.html
您可能需要安裝devel軟件包才能拿起標題,儘管這包含在我的股票CentOS 6.2機器上。
我會保持應用程序簡單,只是繼續寫一個PPM文件,然後使用現有的轉換器,如ImageMagick(convert),GraphicsMagick(gm convert)或pnmtopng,它們都是開源且免費使用的,或者任何其他免費或專有轉換器。
您可以使用原始格式(「P6」)輕鬆編寫PPM文件,該文件佔用的文件空間少得多,而且比ASCII「P3」格式的寫入和讀取更快。您甚至不需要將PPM作爲文件存儲;只是管它到pnmtopng:
your_application | pnmtopng > out.png
pnmtopng是我假設你已經使用的netpbm庫的一部分。它取決於libpng和zlib,但你可能已經有了這些。
我會牢記這一點聽起來像是一個很好的解決方案。 –
谷歌是你的朋友。搜索「png格式的源代碼」。 –
官方的PNG規範非常全面 - 我成功地構建了一個讀取它的PNG讀取器/寫入器。另請參閱http://stackoverflow.com/questions/22672112/png-idat-specification瞭解一些指針。 – usr2564301
如果您擔心依賴關係,您可以使用CImg庫,它只是一個標題,您可以將它添加到您的代碼並隨它一起分發。唯一的問題是編譯時間顯着增加。 –