В этой статье показаны два способа изменения размера изображения (создания миниатюры) в 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);*/
Map hints = 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/”