#java #image #jsp #base64 #bufferedimage
#java #изображение #jsp #base64 #bufferedimage
Вопрос:
У меня есть класс с именем Graphic, который создает новое BufferedImage, рисует новый Graphics2D и возвращает это изображение в виде строки в кодировке base64:
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// Draw background
g2.setColor(Color.decode("#FFFFFF"));
g2.fillRect(0, 0, grafikBreite, grafikHoehe);
g2.setColor(Color.decode("#000000"));
// Draw some rectangles and other stuff...
drawStuff(g2);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] imageInByte = {};
try {
JPEGImageEncoder j = new JPEGImageEncoderImpl(baos);
j.encode(image);
imageInByte = baos.toByteArray();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return javax.xml.bind.DatatypeConverter.printBase64Binary(imageInByte);
В моем jsp-файле я хочу отобразить это изображение, используя, где graphic — это ранее созданный базовый 64-байтовый массив:
<img src="data:image/jpg;base64,<c:out value="${graphic}"/>"/>
Изображение отображается, но проблема в том, что изображение имеет красный фон, а другие используемые цвета также неверны. Если я сохраню созданную строку base64 в виде jpeg-файла на жестком диске, все цвета будут отображаться правильно.
У кого-нибудь есть идея, почему HTML отображает изображение со странными цветами?
Спасибо за помощь
Ответ №1:
Сначала небольшая очистка:
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, grafikBreite, grafikHoehe);
g2.setColor(Color.BLACK);
drawStuff(g2);
g2.dispose(); // TODO
Утилизируйте после создания графики.
Тогда можно попробовать более общий, переносимый класс ImageIO. Настройка параметров для сглаживания и тому подобное немного отличается, но тогда JPEG в любом случае является форматом с потерями. Просто чтобы попробовать другой угол.
ImageIO.write(image, "jpg", baos);
baos.close();
imageInByte = baos.toByteArray();
И затем я сначала закрыл. (Это не влияет на javadoc.)
Можно попробовать .png и другой тип, ABGR.
Я думаю, что ImageIO делает свое дело, или ваш код с ABGR.
Комментарии:
1. Большое вам спасибо. Изменение типа изображения на png и изменение типа BufferdImage на TYPE_4BYTE_ABGR сделали свое дело!