Я написал метод (код ниже), что: < /p>
Изменение изображений, более 720px (сохранение соотношения сторон) < /li>
Платает прозрачность PNG на белом фоне RGB < /li>
Compreseses to Jpeg Использование Imageio с пользовательским качеством (1 - 1 < /> < /li> < /li> < /li> < /li> < /li> < /li> < /li> < /li> < /> < /li> < /> . /> < /ul>
Ищу отзывы: < /p>
Это эффективная, хорошо написанная и наилучшая практика? < /li>
Правильно ли прозрачность для белого? Слишком много качества?public static String convertBase64ToCompressedJpegBase64(
final String base64Image, final float quality) {
try {
// 1. Decode the input string (strip “data:*;base64,” prefix if present)
byte[] decoded = Base64.getDecoder()
.decode(base64Image.replaceFirst("^.*base64,", "").trim());
BufferedImage original = ImageIO.read(new ByteArrayInputStream(decoded));
if (original == null) { // invalid file
throw new BadRequestException(ErrorCode.INVALID_FIELD_FORMAT, "Logo");
}
// 2. Resize to max width = 720 px (maintaining aspect ratio)
final int maxWidth = 720;
if (original.getWidth() > maxWidth) {
float scale = (float) maxWidth / original.getWidth();
int newW = Math.round(original.getWidth() * scale);
int newH = Math.round(original.getHeight() * scale);
Image tmp = original.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
BufferedImage resized = new BufferedImage(newW, newH,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = resized.createGraphics();
g.drawImage(tmp, 0, 0, null);
g.dispose();
original = resized;
}
// 3. Flatten transparency → white and convert to RGB (JPEG needs it)
BufferedImage rgb = new BufferedImage(
original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = rgb.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, rgb.getWidth(), rgb.getHeight());
g2d.drawImage(original, 0, 0, null);
g2d.dispose();
// 4. Compress + write JPEG with chosen quality
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
writer.setOutput(ios);
ImageWriteParam p = writer.getDefaultWriteParam();
if (p.canWriteCompressed()) {
p.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
p.setCompressionQuality(quality); // 0 – 1
}
writer.write(null, new IIOImage(rgb, null, null), p);
ios.close();
writer.dispose();
return "data:image/jpeg;base64," +
Base64.getEncoder().encodeToString(baos.toByteArray());
} catch (Exception e) {
throw new BadRequestException(ErrorCode.INVALID_FIELD_FORMAT, "Logo");
}
}
< /code>
Я реализовал метод обработки изображений Base64 путем изменения размера, сглаживания прозрачности и сжатия их в JPEG с использованием Imageio. Я ожидал, что это:
уменьшить размер файла (особенно для логотипов PNG ~ 200–500KB)
Поддерживать приличное качество изображения после сжатия
Graint Proparency изящно для таких форматов, как PNG
Be Safe и эффективен для использования производства < /p>
Я в основном не неуверен в том, что это наилучший поход - в терминах качества кода, производительности и качества кода и качества кода и производительности.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... ith-imagei
Является ли мой метод Java для изменения размера и сжатия изображения Base64 к JPEG (с Imageio) эффективным и безопасным ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Zipexception - Неправильная проверка данных после javax.imageio.imageio.read (byte [])
Anonymous » » в форуме JAVA - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Что подразумевается под типом, безопасным для вывода или безопасным для ввода?
Anonymous » » в форуме C# - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-