Чтобы захватить изображение компонента, создать образ, получить графический контекст для изображения, а затем попросите компонент рисовать себя с помощью этого графического контекста:
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, но я уверен, что можно что-то понять.
Вы хотите отправить целое изображение (bitmap/png/jpeg и т. Д.) В строку JSON? – Boann
Если JSON поддерживает базу 64, отправьте ее как [Схема URI данных] (http://en.wikipedia.org/wiki/Data_URI_scheme#HTML). –
Boann - к сожалению, да. Мы работаем с отдельной группой, которая делает iPad-версию нашей программы. Мне нужно отправить им график. Вместо того, чтобы получать его в виде последовательности координат (x, y), они попросили меня отправить изображение ... –