Facciamo questo nel progetto JGraphX. Scarica il codice sorgente e dai un'occhiata al pacchetto com.mxgraph.util.png, troverai tre classi per la codifica che abbiamo copiato dalle fonti di Apache Batik. Un esempio di utilizzo è in com.mxgraph.examples.swing.editor.EditorActions nel metodo saveXmlPng. Leggermente modificato il codice è simile:
mxPngEncodeParam param = mxPngEncodeParam
.getDefaultEncodeParam(image);
param.setCompressedText(new String[] { "mxGraphModel", xml });
// Saves as a PNG file
FileOutputStream outputStream = new FileOutputStream(new File(
filename));
try
{
mxPngImageEncoder encoder = new mxPngImageEncoder(outputStream,
param);
if (image != null)
{
encoder.encode(image);
}
}
finally
{
outputStream.close();
}
dove l'immagine è l'BufferedImage che formeranno il .PNG e XML è la stringa che vogliamo inserire nella sezione iTxt. "mxGraphModel" è la chiave per quella stringa xml (la sezione comprende un certo numero di coppie chiave/valore), ovviamente la sostituisci con la tua chiave.
Anche in com.mxgraph.util.png abbiamo scritto una classe molto semplice che estrae l'iTxt senza elaborare l'intera immagine. È possibile applicare la stessa idea per il blocco tEXt usando mxPngEncodeParam.setText anziché setCompressedText(), ma la sezione di testo compresso consente sezioni di testo molto più grandi.
non è che solo per la decodifica? – axel22