とにかく書く

日々の雑感や知り得たことを、とにかく書いています

画像を拡大縮小し、ウィンドウサイズも合わせる

Javaで画像を拡大したり縮小したりして、同時にウィンドウサイズも変換後の画像サイズに合わせる。
JavaFX の ImageView クラスにある拡大縮小機能を使用した。


tiff 画像も読み込みたいので、昔ながらの ImageIO.read メソッドを使用した。
JavaFX の Image クラスは tiff をサポートしていなかった。
ポイントは、imageView クラスの setFitWidth / setFitHeight メソッドを使用しているところ。
setScaleX / setScaleY メソッドを使って拡大縮小すると、描画幅は変わらないため、縮小時は画像の外周が白くなった。

package application;
	
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.BorderPane;
import javax.imageio.ImageIO; // Tiff を読み込むため
import java.awt.image.BufferedImage;
import java.io.File;
import javafx.embed.swing.SwingFXUtils;

public class Main extends Application {
	@Override
	public void start(Stage primaryStage) {
		try {
			// 画像を読み込み (tiff を読み込むため ImageIO を使う)
			String fname = new String("lena.jpg");
			BufferedImage bufferedImage = ImageIO.read(new File(fname));
			WritableImage writableImage = SwingFXUtils.toFXImage(bufferedImage, null);
			ImageView imageView = new ImageView(writableImage);

			// resize
			double width = imageView.getImage().getWidth();
			double height = imageView.getImage().getHeight();
			imageView.setFitWidth(width * 0.5);
			imageView.setFitHeight(height * 0.5);
			
			// 描画
			BorderPane root = new BorderPane();
			root.getChildren().add(imageView);
			// ウィンドウサイズを縮小した画像サイズにして表示する
			Scene scene = new Scene(root, imageView.getFitWidth(), imageView.getFitHeight());
			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}