2014-03-27 151 views
2

目前我有一個ray-tracing program產生浮點(從0到1)或short值(從0到255)的RGB值。 (相關代碼在ImageTools.cppImageTools.hpp。)如何將原始圖像數據保存到PNG圖像?

目前我可以通過編寫PPM,這是可怕的龐大和臃腫產生圖像。

如何從這些數組中的一個寫入PNG圖像?

我更喜歡不添加對大多數Linux系統上不常安裝的任何內容的依賴,因爲我迄今爲止依賴於0。

+0

谷歌是你的朋友。搜索「png格式的源代碼」。 –

+0

官方的PNG規範非常全面 - 我成功地構建了一個讀取它的PNG讀取器/寫入器。另請參閱http://stackoverflow.com/questions/22672112/png-idat-specification瞭解一些指針。 – usr2564301

+1

如果您擔心依賴關係,您可以使用CImg庫,它只是一個標題,您可以將它添加到您的代碼並隨它一起分發。唯一的問題是編譯時間顯着增加。 –

回答

3

你可以使用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

鏈接還看看boost gil create image

+0

想要簡單的解決方案,謝謝 –

1

我假設你不想自己實現這個標準,因此願意通過在你的項目中引入一些依賴來妥協。如果是這樣,libpng通常安裝在大多數Linux系統上。 http://www.libpng.org/pub/png/libpng.html

您可能需要安裝devel軟件包才能拿起標題,儘管這包含在我的股票CentOS 6.2機器上。

2

我會保持應用程序簡單,只是繼續寫一個PPM文件,然後使用現有的轉換器,如ImageMagick(convert),GraphicsMagick(gm convert)或pnmtopng,它們都是開源且免費使用的,或者任何其他免費或專有轉換器。

您可以使用原始格式(「P6」)輕鬆編寫PPM文件,該文件佔用的文件空間少得多,而且比ASCII「P3」格式的寫入和讀取更快。您甚至不需要將PPM作爲文件存儲;只是管它到pnmtopng:

your_application | pnmtopng > out.png 

pnmtopng是我假設你已經使用的netpbm庫的一部分。它取決於libpng和zlib,但你可能已經有了這些。

+0

我會牢記這一點聽起來像是一個很好的解決方案。 –

相關問題