Мы делаем это в проекте 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();
}
Где image - это BufferedImage, который будет формировать .PNG, а xml - это строка, которую мы хотим разместить в разделе iTxt. «mxGraphModel» является ключом для этой строки XML (раздел содержит некоторое количество пар ключ / значение), очевидно, вы заменяете его своим ключом.
Также в com.mxgraph.util.png мы написали действительно простой класс, который извлекает iTxt без обработки всего изображения. Вы можете применить ту же идею для блока tEXt, используя mxPngEncodeParam.setText вместо setCompressedText (), но секция сжатого текста допускает значительно большие текстовые секции.