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);
この部分で、同じ名前だが拡張子の異なる画像を保存できるようにした。
このコードを実行すると、
とJFrameが立ち上がり、Openボタンを押して開く画像を選択する。(今回は最近よく使っているImageJのClownの画像を使用した)そして、Saveボタンを押すと、次のような保存ダイアログが立ち上がる。
名前を付けて画像を保存すると、
このように、予定通り、名前が同じでも拡張子の異なるファイル(ここではpngとtiff、jpg)が保存できた。
tiffファイルをJavaで扱えるようにするには、以前書いたJavaでtiff画像を開く - 生物屋さんのためのゼロからのプログラミングを参照。