Java отображает базовый 64-байтовый массив в jsp

#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 сделали свое дело!