生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

JavaでJFileChooserで画像を開き、名前を付けて画像を保存する。

以前の記事画像を“名前を付けて保存する”。 - 生物屋さんのためのゼロからのプログラミングを少し変えて、同じ名前で拡張子の異なる画像を保存するコードを書いた。

コードは下記。

import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class SaveWithoutExtension extends JFrame implements ActionListener {

	BufferedImage img;
	MyPanel mypane;
	int h, w; //画像のサイズ

	public void openFile () {
		JFileChooser fc = new JFileChooser();
		int select = fc.showOpenDialog(this);

		//ファイルを読み込む
		if (select == JFileChooser.APPROVE_OPTION) {
			try {
			File openFile = fc.getSelectedFile();
			img = ImageIO.read(openFile);
			}catch (IOException ex) {
				System.out.println("Miss");
			}
			h = img.getHeight();
			w = img.getWidth();
		}

		//画像をJFrameに貼る
		JFrame imgFrame = new JFrame ("Image Test");
		imgFrame.setBounds(300, 300, w, h);
		mypane = new MyPanel (w, h);
		imgFrame.getContentPane().add(mypane, BorderLayout.CENTER);
		imgFrame.setVisible(true);
	}

	//画像を貼る用のツール
	public class MyPanel extends JPanel {
		public MyPanel (int width, int height) {
			setSize (width, height);
		}

		public void paintComponent (Graphics g) {
			g.drawImage(img, 0, 0, this);
		}
	}

	//画像を保存する
	public void SaveImage () {

     //名前を取り出す
		String name = writeFile();
 
     //名前を付けて異なる拡張子で保存
		try {
			FileOutputStream fo0 = new FileOutputStream (name + ".png");
			ImageIO.write(img, "png", fo0);
			FileOutputStream fo1 = new FileOutputStream (name + ".tiff");
			ImageIO.write(img, "tiff", fo1);
			FileOutputStream fo2 = new FileOutputStream (name + ".jpg");
			ImageIO.write(img, "jpg", fo2);
		} catch (IOException ex) {
			System.out.println("Miss");
		}
	}

	//出力画像の名前書き
	String writeFile () {
		FileDialog fd = new FileDialog (new Frame (), "保存", FileDialog.SAVE);
		fd.setVisible(true);
		String fullpath = fd.getDirectory() + fd.getFile();
		fd.dispose();
		return fullpath;
	}

	public void actionPerformed (ActionEvent e) {
		String cmd = e.getActionCommand();

		if (cmd.equals("open")) {
			openFile ();
		} else if (cmd.equals ("save")) {
			SaveImage();
		}
	}

	SaveWithoutExtension (String title) {
		setTitle(title);
		setBounds (10, 10, 200, 100);
		setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

		JButton button = new JButton ("Open");
		JButton button1 = new JButton ("Save");
		button.addActionListener (this);
		button1.addActionListener (this);
		button.setActionCommand("open");
		button1.setActionCommand("save");
		button.setBounds(40, 10, 100, 30);
		button1.setBounds (40, 50, 100, 30);
		JPanel pane = new JPanel ();
		pane.setLayout(null);
		pane.add(button);
		pane.add(button1);
		getContentPane().add(pane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		SaveWithoutExtension frame = new SaveWithoutExtension("Image Save");
		frame.setVisible (true);
	}
}

キーとなるのは、

	//画像を保存する
	public void SaveImage () {

		String name = writeFile();
		try {
			FileOutputStream fo0 = new FileOutputStream (name + ".png");
			ImageIO.write(img, "png", fo0);
			FileOutputStream fo1 = new FileOutputStream (name + ".tiff");
			ImageIO.write(img, "tiff", fo1);
			FileOutputStream fo2 = new FileOutputStream (name + ".jpg");
			ImageIO.write(img, "jpg", fo2);
		} catch (IOException ex) {
			System.out.println("Miss");
		}
	}

	//出力画像の名前書き
	String writeFile () {
		FileDialog fd = new FileDialog (new Frame (), "保存", FileDialog.SAVE);
		fd.setVisible(true);
		String fullpath = fd.getDirectory() + fd.getFile();
		fd.dispose();
		return fullpath;
	}

名前を繰り返し使うために、

 String name = writeFile();

この部分で、入力された名前を取り出し、

  FileOutputStream fo0 = new FileOutputStream (name + ".png");
  ImageIO.write(img, "png", fo0);
  FileOutputStream fo1 = new FileOutputStream (name + ".tiff");
  ImageIO.write(img, "tiff", fo1);
  FileOutputStream fo2 = new FileOutputStream (name + ".jpg");
  ImageIO.write(img, "jpg", fo2);

この部分で、同じ名前だが拡張子の異なる画像を保存できるようにした。


このコードを実行すると、
f:id:Aki-Miya:20180127174159p:plainとJFrameが立ち上がり、Openボタンを押して開く画像を選択する。(今回は最近よく使っているImageJのClownの画像を使用した)そして、Saveボタンを押すと、次のような保存ダイアログが立ち上がる。
f:id:Aki-Miya:20180127174455p:plain
名前を付けて画像を保存すると、
f:id:Aki-Miya:20180127174650p:plain このように、予定通り、名前が同じでも拡張子の異なるファイル(ここではpngtiff、jpg)が保存できた。

tiffファイルをJavaで扱えるようにするには、以前書いたJavaでtiff画像を開く - 生物屋さんのためのゼロからのプログラミングを参照。