В этой статье показаны два способа изменения размера изображения (создания миниатюры) в Java.
1. Исходное изображение, 544×184
Ниже приведено Изображение логотипа Google , ширина, высота 544x184
и размер файла 14k
. Позже мы изменим размер изображения ниже на новую ширину и высоту 300х150
.
2. Измените размер изображения или создайте миниатюру.
В этом примере Java используется API BufferedImage.getScaledInstance()
для изменения размера изображения, и мы можем передавать различные подсказки изображения для создания различных масштабированных изображений.
BufferedImage bi = ImageIO.read(input); Image newResizedImage = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
Мы можем настроить качество масштабированного изображения с помощью следующих подсказок изображения:
SCALE_AREA_AVERAGING
– Алгоритм масштабирования изображения с усреднением по площади.МАСШТАБ_ДЕФОЛТ
– Алгоритм масштабирования изображения по умолчаниюМАСШТАБ_БЫСТРЫЙ
– Отдает приоритет скорости масштабирования, чем плавности масштабируемого изображения.SCALE_REPLICATE
– Алгоритм масштабирования изображения, реализованный в классе ReplicateScaleFilterМАСШТАБ_ГЛАДКАЯ
– Отдает приоритет плавности масштабируемого изображения, а не скорости масштабирования.
В следующем примере показано, как изменить размер изображения выше (логотип Google) до новой ширины и высоты 300x150
.
package com.mkyong.io.image; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; public class ResizeImage1 { private static final int IMG_WIDTH = 300; private static final int IMG_HEIGHT = 150; public static void main(String[] args) throws IOException { Path source = Paths.get("C:\\test\\google.png"); Path target = Paths.get("C:\\test\\resize.png"); try (InputStream is = new FileInputStream(source.toFile())) { resize(is, target, IMG_WIDTH, IMG_HEIGHT); } } private static void resize(InputStream input, Path target, int width, int height) throws IOException { BufferedImage originalImage = ImageIO.read(input); /** * SCALE_AREA_AVERAGING * SCALE_DEFAULT * SCALE_FAST * SCALE_REPLICATE * SCALE_SMOOTH */ Image newResizedImage = originalImage .getScaledInstance(width, height, Image.SCALE_SMOOTH); String s = target.getFileName().toString(); String fileExtension = s.substring(s.lastIndexOf(".") + 1); // we want image in png format ImageIO.write(convertToBufferedImage(newResizedImage), fileExtension, target.toFile()); } public static BufferedImage convertToBufferedImage(Image img) { if (img instanceof BufferedImage) { return (BufferedImage) img; } // Create a buffered image with transparency BufferedImage bi = new BufferedImage( img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D graphics2D = bi.createGraphics(); graphics2D.drawImage(img, 0, 0, null); graphics2D.dispose(); return bi; } }
Проанализируйте следующие результаты:
Изображение. МАСШТАБ_ГЛАДКАЯ
bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
На рисунке ниже показано использование Изображения. SCALE_SMOOTH
подсказка, и новое масштабированное изображение имеет размер файла 14 кб
, такой же, как и исходное изображение, но качество отличное.
Изображение. МАСШТАБ_ДЕФОЛТ
bufferedImage.getScaledInstance(width, height, Image.SCALE_DEFAULT);
На рисунке ниже показано использование Изображения. SCALE_DEFAULT
подсказка, и новое масштабированное изображение имеет размер файла 9 кб
.
Изображение. МАСШТАБ_БЫСТРЫЙ
bufferedImage.getScaledInstance(width, height, Image.SCALE_FAST);
На рисунке ниже показано использование Изображения. Подсказка SCALE_FAST
, и новое масштабированное изображение имеет размер файла 9 кб
.
Попробуйте разные вещи в соответствии с вашим случаем.
3. Java изменяет размер изображения, рисует новое изображение.
Этот пример является более гибким (может настраивать фон, цветовую фильтрацию или визуализацию ), но требует дополнительного кодирования для рисования изображения с новым размером.
BufferedImage originalImage = ImageIO.read(input); BufferedImage newResizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = newResizedImage.createGraphics(); // background transparent g.setComposite(AlphaComposite.Src); g.fillRect(0, 0, width, height); // configure RenderingHints g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); // draw a new image g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
Полный пример Java для изменения размера изображения.
package com.mkyong.io.image; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; public class ResizeImage2 { private static final int IMG_WIDTH = 300; private static final int IMG_HEIGHT = 150; public static void main(String[] args) throws IOException { Path source = Paths.get("C:\\test\\google.png"); Path target = Paths.get("C:\\test\\resize.png"); try (InputStream is = new FileInputStream(source.toFile())) { resize(is, target, IMG_WIDTH, IMG_HEIGHT); } } private static void resize(InputStream input, Path target, int width, int height) throws IOException { // read an image to BufferedImage for processing BufferedImage originalImage = ImageIO.read(input); // create a new BufferedImage for drawing BufferedImage newResizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = newResizedImage.createGraphics(); //g.setBackground(Color.WHITE); //g.setPaint(Color.WHITE); // background transparent g.setComposite(AlphaComposite.Src); g.fillRect(0, 0, width, height); /* try addRenderingHints() // VALUE_RENDER_DEFAULT = good tradeoff of performance vs quality // VALUE_RENDER_SPEED = prefer speed // VALUE_RENDER_QUALITY = prefer quality g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); // controls how image pixels are filtered or resampled g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); // antialiasing, on g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);*/ Maphints = new HashMap<>(); hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); hints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.addRenderingHints(hints); // puts the original image into the newResizedImage g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null); g.dispose(); // get file extension String s = target.getFileName().toString(); String fileExtension = s.substring(s.lastIndexOf(".") + 1); // we want image in png format ImageIO.write(newResizedImage, fileExtension, target.toFile()); } }
Размер файла нового масштабированного изображения составляет около 13 кб
.
Новая ширина и высота 300x150
Попробуйте различные подсказки, чтобы найти правильный баланс скорости масштабирования и плавности масштабируемого изображения.
Скачать Исходный Код
$клон git $клон git
$cd java-ввод-вывод
Рекомендации
- Изображение Javax
- Учебные пособия по Java – Работа с изображениями
- Изображение JavaDoc
- Визуализация указывает javadoc
- Как читать и писать изображение на Java
Оригинал: “https://mkyong.com/java/how-to-resize-an-image-in-java/”