Это действительно очень легко, просто не очень интуитивным.
Необходимо удлинить ImageTranscoder
. В методе createImage
вы выделяете BufferedImage
, кешируете его как переменную-член и возвращаете. Метод writeImage
пуст. И вам нужно будет добавить получателя для извлечения BufferedImage
.
Это будет выглядеть примерно так:
class MyTranscoder extends ImageTranscoder {
private BufferedImage image = null;
public BufferedImage createImage(int w, int h) {
image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
return image;
}
public void writeImage(BufferedImage img, TranscoderOutput out) {
}
public BufferedImage getImage() {
return image;
}
}
Теперь, чтобы создать изображение, которое вы создаете экземпляр вашего транскодер и передать ему нужную ширину и высоту, установив TranscodingHints
. Наконец, вы перекодируете из TranscoderInput в нулевую цель. Затем позвоните получателю на транскодер, чтобы получить изображение.
вызов выглядит примерно так:
MyTranscoder transcoder = new MyTransCoder();
TranscodingHints hints = new TranscodingHints();
hints.put(ImageTranscoder.KEY_WIDTH, width);
hints.put(ImageTranscoder.KEY_HEIGHT, height);
transcoder.setTranscodingHints(hints);
transcoder.transcode(new TranscoderInput(url), null);
BufferedImage image = transcoder.getImage();
Простой, правильно? (Да, верно. Только взял меня за 2 недели, чтобы понять это. Вздох.)
Да, что сказал Девон. :) Вот мой класс SVGIcon, который в значительной степени делает это: http://mcc.id.au/2005/04/SVGIcon.java – heycam
Начальная строка этого ответа запечатывает его для меня. Почему я не могу дать больше, чем +1 для этого ответа? Это ** точно **, что делает SO настолько хорошим. – kevinarpe