Мы делаем это в проекте JGraphX. Загрузите исходный код и посмотрите в пакете com.mxgraph.util.png, там вы найдете три класса для кодирования, которые мы скопировали из источников Apache Batik. Пример использования - в com.mxgraph.examples.swing.editor.EditorActions в методе saveXmlPng. Слегка отредактированный код выглядит следующим образом:
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();
}
Где изображение является BufferedImage, который будет формировать .PNG и XML является строка, которую мы хотим разместить в разделе iTxt. «mxGraphModel» является ключом для этой строки xml (раздел содержит некоторое количество пар ключ/значение), очевидно, вы заменяете это на свой ключ.
Также в com.mxgraph.util.png мы написали действительно простой класс, который извлекает iTxt без обработки всего изображения. Вы можете применить ту же идею для фрагмента tEXt, используя mxPngEncodeParam.setText вместо setCompressedText(), но сжатый текстовый раздел позволяет значительно увеличить текстовые разделы.
не то, что только для декодирования? – axel22