Рубрики
Без рубрики

Как изменить размер изображения в Java

В этой статье показано, как изменить размер изображения (создать миниатюру) в Java.

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

Мы можем настроить качество масштабированного изображения с помощью следующих подсказок изображения:

  1. SCALE_AREA_AVERAGING – Алгоритм масштабирования изображения с усреднением по площади.
  2. МАСШТАБ_ДЕФОЛТ – Алгоритм масштабирования изображения по умолчанию
  3. МАСШТАБ_БЫСТРЫЙ – Отдает приоритет скорости масштабирования, чем плавности масштабируемого изображения.
  4. SCALE_REPLICATE – Алгоритм масштабирования изображения, реализованный в классе ReplicateScaleFilter
  5. МАСШТАБ_ГЛАДКАЯ – Отдает приоритет плавности масштабируемого изображения, а не скорости масштабирования.

В следующем примере показано, как изменить размер изображения выше (логотип 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-ввод-вывод

Рекомендации

Оригинал: “https://mkyong.com/java/how-to-resize-an-image-in-java/”