Я следовал за ответом xehpuk, но у него были проблемы с определенными изображениями, в которых отсутствовали последние несколько строк пикселей при визуализации в определенных браузерах через URL-адрес данных (Chrome и Firefox, Safari, похоже, отображал их нормально). Я подозреваю, что это потому, что браузер делает все возможное, чтобы интерпретировать данные, но последние несколько байтов данных отсутствовали, поэтому он показывает, что он может.
Кажется, причиной этой проблемы является обтекание выходного потока. Документация для Base64.wrap(OutputStream os)
объясняет:
Рекомендуется незамедлительно закрыть возвращенный выходной поток после использования, во время которого он сбрасывает все возможные оставшиеся байты в базовый выходной поток.
Таким образом, в зависимости от длины данных, возможно, что последние несколько байтов не сбрасываются из потока, потому что close()
не вызывается для него. Мое решение этого состояло в том, чтобы не беспокоить обтекание потока и просто закодировать поток непосредственно:
public static String imgToBase64String(final RenderedImage img, final String formatName)
{
final ByteArrayOutputStream os = new ByteArrayOutputStream();
try
{
ImageIO.write(img, formatName, os);
return Base64.getEncoder().encodeToString(os.toByteArray());
}
catch (final IOException ioe)
{
throw new UncheckedIOException(ioe);
}
}
Это решило проблемы с отсутствующими рядами пикселей при визуализации в браузере.