2017-06-04 36 views
0

首先一點上下文。我需要翻轉一個PNG圖像。我得到每個字節的信息(按順序),我必須將它翻轉爲一個流。我設法分割和解析塊。但是,當我有IDAT塊數據時,我不知道如何處理它以便翻轉它。下降IDAT塊來翻轉圖像

從IHDR INFO:位深度= 08(每樣本8位)和顏色類型= 06. 的圖像是800×600 = 480000

的IDAT大小是179502,使得是的0.374總像素大小(怪異)。

如果我翻轉像素(所有的IDAT數據,因爲它)我得到一個圖像,當我打開它只是顯示一個透明的圖像。我也嘗試使用4字節= 1像素,因爲我有RGB + alpha但仍然沒有好的結果。 (總是一個透明的圖像......這也是非常奇怪的...我希望隨機圖像,而不是透明的圖像)。

我已經讀過信息是壓縮的,所以我的計劃是解壓縮它,翻轉RGB陣列,然後再次壓縮,但是...我如何解壓縮並再次壓縮它?我無法找到信息/算法來做到這一點。

我也發現0x78十六進制幾乎總是在IDAT部分之後,所以我推斷壓縮像素陣列並不是直接在IDAT之後啓動,而是在一些字節之後......如果是這樣的話...... 它是如何組織的?它僅僅是像素數組,還是它在IDAT塊數據之前和/或之後有一些信息?

+0

希望我對我的問題已經很清楚了,我要求原諒我的英語並不完美。 –

回答

1

IDAT組塊包含圖像的像素數據,預先過濾和壓縮。爲了得到你需要的RGB到:

  • 串接所有IDAT塊
  • 解壓
  • 不過濾的filter根據圖像的pixel format應用於每一行的
  • 流(ZLIB)你可能在每一個字節,或者可能是單詞,或者可能有一些位(也許它們不是RGB組件,但是索引到調色板,或者灰度,或者與阿爾法...)中具有RGB分量

總之,你需要解碼一個PNG圖像,這是不平凡的。那裏有很多PNG解碼器,所以我不知道你爲什麼想要重新擺放車輪。如果你真的想自己做,那麼你需要閱讀PNG standard的細節。

+0

我不太確定,教授剛纔告訴我要這樣做......我會用隱寫術,所以我猜他想把它作爲一個關於它如何工作的「學習」,但是誰知道。無論如何,這些信息非常有用,我已經下載了ZLIB,因此我正在按照您的步驟進行操作。順便說一句,你能說出你說的一些png解碼器嗎?它可以幫助我檢查結果。 –

+0

「規範」是[libpng](http://www.libpng.org/pub/png/libpng.html)。我用Java編寫了一個,[PNGJ](https://github.com/leonbloy/pngj)。雖然這項任務聽起來很瘋狂。你確定嗎?使用更簡單的圖像格式(如BMP)會更有意義。 – leonbloy

+0

我會和他談談,我猜他認爲bmp更簡單,只需閱讀標題並使用像這樣的位...我只是遇到了你的github存儲庫,我正在下載它:)非常感謝幫助。 –