2014-07-21 222 views
2

我試圖保存元數據,但它沒有得到保存,我也沒有得到任何錯誤。 圖像得到正確保存。 我正在使用PNGJ庫。PNGj,元數據沒有得到保存

閱讀元數據,(和圖像)正常工作,我正在與imagemagick檢查。

的代碼是:

ImageInfo imi = new ImageInfo(size.x, size.y, 8, true); 
PngWriter pngW = new PngWriter(outputStream, imi); 
pngW.setCompLevel(compressionLevel); 
pngW.getMetadata().setText(PngChunkTextVar.KEY_Title, "My image"); 

ImageLineInt iline = new ImageLineInt(imi); 

for (int row = 0, c = 0; row < pngW.imgInfo.rows; row++) { 
    for (int col = 0; col < imi.cols; col++) { 
     int r = image[c++] & 0xFF, g = image[c++] & 0xFF, b = image[c++] & 0xFF, a = image[c++] & 0xFF; 
     ImageLineHelper.setPixelRGBA8(iline, col, r, g, b, a); 
    } 

    pngW.writeRow(iline); 
} 
pngW.end(); 

爲什麼沒有元數據得到保存,或者爲什麼我沒有拿到一個錯誤信息?

+0

它適用於我。你確定元數據沒有寫嗎?請注意(除非另有說明)塊儘可能晚寫入(在這種情況下:文本塊將在IDAT塊之後寫入。可以使用http://entropymine.com/jason/tweakpng/ – leonbloy

+0

進行檢查謝謝,我沒有這麼做!這實際上是我的程序中的問題,拋出我的是imagemagick不會顯示我用PNGJ編寫的塊,但它顯示用GIMP或TweakPNG編寫的塊。有什麼辦法可以提前閱讀元數據?我應該只是打開(並關閉)另一個PNGreader? –

+0

「imagemagick不會顯示我用PNGJ編寫的塊」爲什麼?因爲他們在IDAT之後?這將是一個錯誤。你可以驗證一下,TweakPNG可以讓你移動一個塊。「有什麼方法可以預先讀取元數據嗎?」我不明白這是什麼意思。 – leonbloy

回答

1

在PNG格式中,文本塊在塊序列中的位置沒有限制:它們可以放在IDAT塊(像素數據)之後。這是因爲假定文本元數據不應該被需要(或影響)圖像顯示。

PNGJ庫的PngWriter會將元數據塊放入隊列中,以便在合法/可能的情況下寫入(默認情況下)。實際上,這意味着文本塊將在IDAT塊之後編寫。如果你不想要這個,你應該首先問問自己,如果你真的想把圖像信息(你需要顯示圖像)放在文本塊中,這聽起來很糟糕。無論如何,如果你想強制文本塊儘早寫入,只需將優先級設置爲true:PngChunk.setPriority()

+0

感謝幫助了很多!我的意圖是使用png而不是專有格式來存儲我需要的圖像的所有數據,並使其與其他軟件一起打開變得簡單。 –