在 Java 中調整影象大小

Rupam Yadav 2023年10月12日
  1. 在 Java 中使用 BufferedImage.getScaledInstance() 調整和顯示影象的大小
  2. 在 Java 中使用 Graphics2DImageIO 調整影象大小並儲存到本地目錄
在 Java 中調整影象大小

Java 可以執行多種不同型別的操作,例如讀取、寫入或刪除檔案。在以下示例中,我們將演示如何使用三種技術在 Java 中調整影象大小。

在 Java 中使用 BufferedImage.getScaledInstance() 調整和顯示影象的大小

在第一個示例中,我們調整影象大小並將其顯示在框架內,而不將其儲存在任何地方。在這裡,我們建立了 BufferedImage 類的物件 bufferedImageBufferedImage 類擴充套件了 Image 類,將圖形影象表示為矩形畫素陣列。要讀取影象,我們使用 ImageIO.read() 函式。在這裡,ImageIO 是一個包含靜態方法(如 readwrite)的類,用於執行輸入和輸出操作。

我們使用 new File() 方法獲取影象,該方法呼叫 File 類建構函式並將影象位置作為引數傳遞給其中。一旦我們獲得了 bufferedImage 物件,我們就用它來呼叫 getScaledInstance() 方法來建立影象的縮放版本。

getScaledInstance 函式接受三個引數:前兩個是我們想要給影象的寬度和高度(以畫素為單位),最後一個引數是用於縮放的演算法。在這裡,我們使用 Image.SCALE_DEFAULT 函式,它告訴類使用預設取樣演算法。

完成後,我們建立一個視窗以使用 JFrame 物件顯示影象。我們將 frame 物件的佈局設定為 FlowLayout,它將元件排列成一行。然後,我們設定視窗的大小;請注意,此大小應大於影象的高度和寬度以完整顯示圖片。

最後,為了顯示影象,我們建立了一個 JLabel 物件並呼叫了將影象設定為圖示的 section 類。最後,我們將 jLabel 物件新增到 frame 物件並將可見性設定為 true。

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ResizeImageExample {
  public static void main(String[] args) throws IOException {
    new ResizeImageExample();
  }

  public ResizeImageExample() throws IOException {
    BufferedImage bufferedImage = ImageIO.read(new File("C:\\Users\\User1\\Pictures\\java.png"));
    Image image = bufferedImage.getScaledInstance(600, 400, Image.SCALE_DEFAULT);

    ImageIcon icon = new ImageIcon(image);
    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.setSize(800, 600);

    JLabel jLabel = new JLabel();
    jLabel.setIcon(icon);
    frame.add(jLabel);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

輸出:

java 調整影象大小 1

在 Java 中使用 Graphics2DImageIO 調整影象大小並儲存到本地目錄

在第二種方法中,我們使用 Graphics2D 類來建立圖形。第一步是使用 ImageIo.read() 方法獲取影象檔案,該方法將 File 物件作為包含影象路徑的引數。ImageIo.read() 返回 BufferedImage 物件,bufferedImageInput。我們建立了另一個在寫入影象時使用的 BufferedImage 物件。它接受三個引數:高度、寬度和影象型別。

現在我們使用返回 Graphics2D 物件 g2dbufferdImageOutput 物件呼叫 createGraphics() 方法。然後,我們使用帶有六個引數的 drawImage() 方法建立影象。第一個是 BufferedImage 物件,第二個和第三個是 x 和 y 座標,如果兩個值都為零,它們會根據大小放大。第四個和第五個引數代表我們想要給影象的新高度和寬度,最後一個引數是 ImageObserver,在我們的例子中是 null

在繼續之前,我們使用 g2d.dispose() 函式處理 g2d 使用的所有上下文和資源。要將調整後的影象儲存在本地目錄中,我們使用 ImageIo.write() 函式,該函式採用 bufferedImageOutput 物件、要賦予新影象檔案的名稱以及帶有檔案路徑的 File 建構函式。

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ResizeImageExample {
  public static void main(String[] args) throws IOException {
    resizeFile("C:\\Users\\Rupam Saini\\Pictures\\java.png",
        "C:\\Users\\Rupam Saini\\Pictures\\java-resized.png", 500, 500);
  }

  public static void resizeFile(String imagePathToRead, String imagePathToWrite, int resizeWidth,
      int resizeHeight) throws IOException {
    File fileToRead = new File(imagePathToRead);
    BufferedImage bufferedImageInput = ImageIO.read(fileToRead);

    BufferedImage bufferedImageOutput =
        new BufferedImage(resizeWidth, resizeHeight, bufferedImageInput.getType());

    Graphics2D g2d = bufferedImageOutput.createGraphics();
    g2d.drawImage(bufferedImageInput, 0, 0, resizeWidth, resizeHeight, null);
    g2d.dispose();

    String formatName = imagePathToWrite.substring(imagePathToWrite.lastIndexOf(".") + 1);

    ImageIO.write(bufferedImageOutput, formatName, new File(imagePathToWrite));
  }
}

調整大小前的影象:

java 調整影象大小 2

調整大小後的影象:

java 調整影象大小 3

作者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

相關文章 - Java Image