2010-03-29 310 views

回答

2

我已經編寫了一個用於讀/寫PNG的基本Java庫文件:http://code.google.com/p/pngj/

它不支持palleted圖像,但除了那 [更新:它支持現在所有的PNG變種]這是相當完整的,簡單的代碼,沒有外部的依賴關係(即只使用標準JSE API ,其中包括zip解壓縮)。代碼可用。我想你可以用很少的努力將它移植到C上。

4

爲什麼不使用libpng? PNG文件格式非常簡單,但有許多不同的可能的變體和編碼方法,確保覆蓋所有的情況可能非常繁瑣。像libpng這樣的東西自動處理所有的轉換和東西。

+0

嗨,因爲我被告知使用標準C庫,我不能使用libpng庫嗎? – 2010-03-29 04:17:26

+0

告訴誰?這是功課嗎?如果是這樣,你應該爲'家庭作業'添加一個標籤。 – 2010-03-29 04:24:42

+0

好的。你現在可以引導我嗎? – 2010-03-29 07:29:14

0

您應該仔細閱讀二進制文件格式的工作原理,並使用十六進制編輯器而不是文本編輯器來查看這些文件。通常你應該使用libpng來處理前面提到的png文件,但是如果你想自己解碼,你需要做很多的閱讀工作。

我建議你閱讀這http://www.libpng.org/pub/png/book/chapter13.html

+0

嗨,我被告知只使用標準的C庫和zlib是唯一一個正在額外提供。你能給我一些指點嗎? – 2010-03-29 04:16:47

+0

我給出的鏈接是關於libpng如何解壓縮png的詳細說明。我的猜測是zlib應該在取出標題等之後用於原始數據。 – Hobblin 2010-03-29 14:26:32

2

如果這是一個家庭作業,你真的只限於標準C庫,你可以看官方的PNG文件格式規範:http://www.w3.org/TR/PNG/。但是,你確定你確實需要解碼PNG文件嗎?如果你需要做的就是以某種方式展示它,那麼你就走錯了路。

爲任何一般的PNG文件編寫解碼器將會非常複雜和耗時,但對於簡單的PNG文件來說不會太糟糕。事實上,由於PNG格式允許壓縮它的一部分,因此只需要使用標準C庫就可以實現gzip解壓縮(這是中級本科課程的合理作業),但我的猜測是你在分配給你之前會花費很多討論壓縮算法)

但是,如果將自己限制爲非壓縮的非隔行PNG文件,這並不是非常困難。我在Python中編寫了一個解碼器,僅在幾個小時內處理了簡單的情況,所以我確信它可以在C中實現。

+0

嗨smehmood,謝謝你的信息。但我需要使用標準C函數讀取PNG文件,解壓縮文件,然後以可讀格式打印文件的信息。要打印的信息包括:PNG文件的結構,PNG文件的簽名,每個塊的類型和長度。 – 2010-03-29 17:49:15

+1

你所描述的是非常可行的。你只需要閱讀我提供的PNG文件格式規範,它會告訴你文件是如何佈局的,以及所有信息的存儲位置。 – smehmood 2010-03-29 19:08:00