2014-02-17 52 views
2

我一直在試圖找到一種方法來寫入元數據到PNG,我已經嘗試了很多。我如何寫入元數據到PNG圖片

我可以使用使用pngj庫讀取數據:

PngReader pngr = new PngReader(file); 
pngr.readSkippingAllRows(); // reads only metadata 
for (PngChunk c : pngr.getChunksList().getChunks()) { 
    if (!ChunkHelper.isText(c)) continue; 
     PngChunkTextVar ct = (PngChunkTextVar) c; 
     String key = ct.getKey(); 
     String val = ct.getVal(); 
     System.out.print(key + " " + val + "\n");  
    } 
pngr.close(); 

而且它的偉大工程。但我需要寫信給它。

我曾嘗試:

public boolean writeCustomData(String key, String value) throws Exception { 

    PngReader pngr = new PngReader(currentImage); 
    PngWriter png = new PngWriter(new FileOutputStream(currentImage), pngr.imgInfo); 
    png.getMetadata().setText(key, value); 
    return true; 
} 

但這沒什麼。

而且我使用的答案從Writing image metadata in Java, preferably PNG

這工作(有點)試過,但我讀功能無法看到它。

回答

4

如果你想添加一大塊的形象,你必須讀取和寫入的完整圖像。例如

PngReader pngr = new PngReader(origFile); 
PngWriter pngw = new PngWriter(destFile, pngr.imgInfo, true); 
// instruct the writer to copy all ancillary chunks from source 
pngw.copyChunksFrom(pngr.getChunksList(), ChunkCopyBehaviour.COPY_ALL); 
// add a new textual chunk (can also be done after writing the rows) 
pngw.getMetadata().setText("my key", "my val"); 
// copy all rows 
for (int row = 0; row < pngr.imgInfo.rows; row++) { 
    IImageLine l1 = pngr.readRow(); 
    pngw.writeRow(l1); 
} 
pngr.end(); 
pngw.end(); 

如果需要更高的性能,可以讀/在一個較低的水平寫塊,見this example

+0

這樣我們需要提供一個目標文件,如果我想將元數據寫入到創建新文件的同一個文件中,該怎麼辦? –

+0

@AnkeshkumarJaisansaria你寫入其他文件並重新命名。相信我,沒有別的辦法。 – leonbloy

+0

好的..謝謝你真的很喜歡你的答案。 –

0

試試這個:

Stream pngStream = new System.IO.FileStream("smiley.png", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 
PngBitmapDecoder pngDecoder = new PngBitmapDecoder(pngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
BitmapFrame pngFrame = pngDecoder.Frames[0]; 
InPlaceBitmapMetadataWriter pngInplace = pngFrame.CreateInPlaceBitmapMetadataWriter(); 
if (pngInplace.TrySave() == true) 
{ 
    pngInplace.SetQuery("/Text/Description", "Have a nice day."); 
} 

pngStream.Close(); 
+0

我需要設置一個塊密鑰和值。所以我的閱讀功能會找到它。 – Snhp9