2013-11-29 1 views
1

Это довольно абстрактный вопрос, поэтому он не содержит SSCCE. В принципе, я хочу отправить граф, который я создаю как часть строки JSON. Однако для этого мне нужно будет отправить этот компонент (график) в формате, который имеет смысл. Мне было интересно, есть ли такой формат?Отправка JComponent как изображения

Извините за абстрактность, я просто был полностью в тупике.

Приветствия, Кеш

+0

Вы хотите отправить целое изображение (bitmap/png/jpeg и т. Д.) В строку JSON? – Boann

+0

Если JSON поддерживает базу 64, отправьте ее как [Схема URI данных] (http://en.wikipedia.org/wiki/Data_URI_scheme#HTML). –

+0

Boann - к сожалению, да. Мы работаем с отдельной группой, которая делает iPad-версию нашей программы. Мне нужно отправить им график. Вместо того, чтобы получать его в виде последовательности координат (x, y), они попросили меня отправить изображение ... –

ответ

1

Чтобы захватить изображение компонента, создать образ, получить графический контекст для изображения, а затем попросите компонент рисовать себя с помощью этого графического контекста:

Component comp = ...; 
BufferedImage image = new BufferedImage(comp.getWidth(), comp.getHeight(), 
    BufferedImage.TYPE_INT_RGB); 
Graphics2D g = image.createGraphics(); 
comp.paint(g); 
g.dispose(); 

(. импорт java.awt.image.BufferedImage если не уже)

Чтобы упаковать это изображение транспорта, мы можем сжать его в формате PNG и создать Base64 кодирование двоичных данных:

StringBuilder sb = new StringBuilder(); 
try (OutputStream out = new Base64Encoder(sb)) { 
    javax.imageio.ImageIO.write(image, "png", out); 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} 
String imageData = sb.toString(); 

Моя реализация кодера Base64, так как Java не один:

import java.io.*; 

public class Base64Encoder extends OutputStream { 
    private Appendable out; 
    private int p = 0, tmp = 0; 
    private static final char[] charMap = 
     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 
     .toCharArray(); 

    public Base64Encoder(Appendable out) { 
     this.out = java.util.Objects.requireNonNull(out); 
    } 

    @Override 
    public void write(int b) throws IOException { 
     b &= 0xFF; 
     if (p == 0) { 
      out.append(charMap[b >> 2]); 
      tmp = (b & 0x3) << 4; 
      p = 1; 
     } else if (p == 1) { 
      out.append(charMap[tmp | (b >> 4)]); 
      tmp = (b & 0xF) << 2; 
      p = 2; 
     } else { 
      out.append(charMap[tmp | (b >> 6)]); 
      out.append(charMap[b & 0x3F]); 
      p = 0; 
     } 
    } 

    @Override 
    public void close() throws IOException { 
     if (p != 0) { 
      out.append(charMap[tmp]); 
      if (p == 1) out.append('=').append('='); 
      if (p == 2) out.append('='); 
     } 
     out = null; 
    } 
} 

Вы будете в конечном итоге с длинной строки, начиная с «iVBOR» (кодировке base64 форма " PNG "), который можно легко упаковать в объект JSON.

Если вы предварять строку с «data:image/png;base64,» становится правильный data URI, что веб-браузеры могут отображать напрямую (вы можете связаться с ним или использовать его в качестве <img> тега src). Я не уверен, что это жизнеспособный способ отобразить его на iPad, но я уверен, что можно что-то понять.

+0

Спасибо, Боан, я рассмотрю это, как только смогу, а затем отметьте его, если он работает. Я не забыл тебя, просто у меня на колени выпала еще одна большая задача, и у меня не было возможности повторить второй взгляд. –

 Смежные вопросы

  • Нет связанных вопросов^_^