#svg #batik
#svg #батик
Вопрос:
У меня есть метод, который генерирует массив байтов, который может быть представлен в виде двумерного изображения. Я хотел бы показать это изображение в качестве фонового изображения в batik. Я не хочу сохранять массив на диск (как изображение), а затем загружать его в batik. Вместо этого я хотел бы предоставить массив для батика. Я думал, что использование ParsedURLData может мне помочь, но я не могу понять, как заставить это работать. Есть предложения?
Я вызываю ParsedURL.registerHandler(new MyProtocolHanlder("myprotocol"));
и MyProtocolHanlder.parseURL
возвращает MyParsedURLData
.
Я думал, что возврат моего собственного потока сработает, но это не так. В примере ниже я просто загружаю изображение с диска и пытаюсь отобразить его.
class MyParsedURLData extends ParsedURLData {
public MyParsedURLData() {
}
@Override
public InputStream openStreamRaw(String arg0, Iterator arg1) throws IOException {
return new File("some_image_here").toURI().toURL().openStream();
}
}
Если в конструкторе для MyParsedURLData
я установлю protocol = "file"
и path="another_image"
, то будет загружено другое изображение, независимо от того, какой поток возвращается openStreamRaw
.
Есть предложения?
Ответ №1:
Самый простой способ — сохранить изображение во временный файл, затем просто сослаться на него через File.toURI().toURL()
, и Batik загрузит его. Для этого вам не нужен пользовательский обработчик протокола или ParsedURL
. Выберите стандартный формат изображения, поддерживаемый Batik, такой как PNG
или JPEG
для временного файла!
Вы можете сохранить временный файл, реализовав как a ParsedURLProtocolHandler
, так и a RegistryEntry
, и зарегистрировать их в Batik. На веб-сайте есть небольшая документация по этому вопросу, но это все еще непросто сделать. Мне потребовалось несколько часов, чтобы разобраться (и код на самом деле не готов для совместного использования), но теперь я могу передать BufferedImage
непосредственно в Batik, не кодируя его сначала как .png
или аналогичный файл.