2014-03-26 39 views
1

我正在通過W3 PNG規範(從零開始創建一個PNG庫),並且我終於找到了如何創建一個綠色的1x1圖像。PNG IDAT規範

現在我試圖創建混合​​紅色,綠色和藍色像素的更大圖像。假設一張4x4圖片。可悲的是我得到的所有像素混合,其中一些是黑色或粉紅色。

詳細說明:

  • 簽名:行
  • IHDR:OK
    • 寬度:4
    • 嗨:4
    • 位深度:8
    • 顏色:2
    • 篩選:0
    • 壓縮:0
    • 隔行:0
  • IDATA:4塊*
  • IEND:OK

* IDATA塊:

  • 4個字節長度:字節數Zlib泄氣後的DATA數據
  • 4 * 1字節類型:IDAT
  • X字節數據:4 * 4字節的無符號整數,zlib的放氣時,一個接一個地,網絡字節順序
    • 255用於藍色**
    • 65280綠色**
    • 16711680後用於紅色**
  • 4個字節的CRC:OK

**按位的結果:

alpha<<24 | red<<16 | green<<8 | blue 

使用alpha,藍色,綠色和紅色取值從0到255

這是什麼問題?

+0

這個問題被交叉發佈到DSP,所以我複製了我的答案。 –

回答

2

的PNG像素的RGBA順序,不ARGB,所以你需要寫

alpha | red<<24 | green << 16 | blue <<8 

但是你寫的顏色2型,讓你的像素應該是3個字節的每個 而不是四個;就像你所做的那樣,你不能像4個字節的整數 那樣編碼它們。因此,將顏色類型更改爲6或切換爲 以將每個樣本作爲單獨的字節寫入。

此外,您還需要在每行開始處的過濾器字節。零將爲你工作 。所以,在你的榜樣4x4的RGB圖像,你需要寫13個字節每 行

0 R G B R G B R G B R G B 
0 R G B R G B R G B R G B 
0 R G B R G B R G B R G B 
0 R G B R G B R G B R G B 

再串接所有行的字節到一個字節流和zlib,壓縮一點。它可以全部進入一個IDAT塊。如果您需要編寫較小的IDAT塊,則必須先對zlib-compress圖像進行壓縮,然後將zlib輸出拆分爲連續放入IDAT塊的塊。

+0

很好的解釋。我會馬上嘗試。關於行...我猜他們會根據圖像寬度渲染,是嗎?所以我只需要將這些13bytes組一個接一個地寫出 – robertodecurnex

+0

是的,只需將您的行字節連接成一個長流並將其發送到zlib即可。 –

+0

工作完美! – robertodecurnex