「Java/swing/サンプル/画像表示(拡大縮小)」の編集履歴(バックアップ)一覧に戻る

Java/swing/サンプル/画像表示(拡大縮小) - (2022/04/21 (木) 10:46:36) のソース

Javaのswingで画像を拡大縮小して表示するサンプルです。

* ポイント
+ ImageIconクラスでアイコンとして画像を読み込みます。
+ getScaledInstanceで大きさを変更します。
++ 幅と高さともに同じ倍率にする場合、高さは-1にしてもいいです。
+ MediaTrackerで処理の終了を待ちます。
++ 画像の加工は、加工完了する前に処理が戻ってくるので、waitForAll()などで処理の終了を待機する必要がある…らしいです。
+ JLabelにアイコンを設定します。

大きさを変更するのも意外と簡単です。

* 実行結果
&ref(swing 画像表示サンプル2.png)

* ソース &ref(ImageTest2.java)
#highlight(java) {{
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.MediaTracker;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSeparator;

// swing 画像表示サンプル2 画像を拡大縮小してみよう
// ポイント1.ImageIconクラスでアイコンとして画像を読み込みます。
// ポイント2.getScaledInstanceで大きさを変更します。
//        幅と高さともに同じ倍率にする場合、高さは-1にしてもいいです。
//        
// ポイント3.MediaTrackerで処理の終了を待ちます。
//        画像の加工は、加工完了する前に処理が戻ってくるので、waitForAll()などで処理の終了を待機する必要がある…らしいです。
// ポイント4.JLabelにアイコンを設定します。
// 大きさを変更するのも意外と簡単です。
public class ImageTest2 extends JFrame {
  public static void main(String[] args) {
    new ImageTest2();
  }

  public ImageTest2() {
    setTitle("swing 画像表示サンプル2 画像を拡大縮小してみよう");
    // 今回はレイアウトマネージャを使います
    setLayout(new FlowLayout());

    // ポイント1.ImageIconクラスでアイコンとして画像を読み込みます。
    ImageIcon icon = new ImageIcon("logo3w.png");

    MediaTracker tracker = new MediaTracker(this);
    // ポイント2.getScaledInstanceで大きさを変更します。
    Image smallImg = icon.getImage().getScaledInstance((int) (icon.getIconWidth() * 0.5), -1,
        Image.SCALE_SMOOTH);
    Image bigImg = icon.getImage().getScaledInstance((int) (icon.getIconWidth() * 1.5), -1,
        Image.SCALE_SMOOTH);

    // ポイント3.MediaTrackerで処理の終了を待ちます。
    tracker.addImage(smallImg, 1);
    tracker.addImage(bigImg, 2);

    ImageIcon smallIcon = new ImageIcon(smallImg);
    ImageIcon bigIcon = new ImageIcon(bigImg);

    try {
      tracker.waitForAll();
    } catch (InterruptedException e) {
      System.out.println("なんかエラーでた。");
    }

    // ポイント4.JLabelにアイコンを設定します。
    JLabel l = new JLabel("0.5", smallIcon, JLabel.LEFT);
    JLabel ll = new JLabel("1.0", icon, JLabel.LEFT);
    JLabel lll = new JLabel("1.5", bigIcon, JLabel.LEFT);

    // 関係ないポイント
    // 横幅の大きなJseparatorを差し込むと、JFlowLayoutの強制改行みたいな事ができます
    JSeparator sp = new JSeparator();
    JSeparator sp2 = new JSeparator();
    sp.setPreferredSize(new Dimension(5000, 0));
    sp2.setPreferredSize(new Dimension(5000, 0));

    add(l);
    add(sp);
    add(ll);
    add(sp2);
    add(lll);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setBounds(100, 100, 500, 350);
    setVisible(true);
  }
}
}}

* コメント(バグ、間違い、こんな情報が欲しい等ありましたら)
#pcomment(reply)

* アンケート(このページの情報はお役に立ちましたか?)
#tvote("役に立った[53]","役に立たない[15]","分かりにくい[23]","間違っている[0]")