OSDN Git Service

リポジトリ内改行コードのLFへの修正
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / graphics / io / UkagakaImageSaveHelper.java
index 37e0725..3dd3889 100644 (file)
-package charactermanaj.graphics.io;\r
-\r
-import java.awt.Color;\r
-import java.awt.Graphics2D;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.image.BufferedImage;\r
-import java.io.BufferedOutputStream;\r
-import java.io.File;\r
-import java.io.FileOutputStream;\r
-import java.io.IOException;\r
-import java.util.Properties;\r
-import java.util.logging.Level;\r
-import java.util.logging.Logger;\r
-\r
-import javax.imageio.IIOImage;\r
-import javax.imageio.ImageIO;\r
-import javax.imageio.ImageReadParam;\r
-import javax.imageio.ImageReader;\r
-import javax.imageio.ImageWriteParam;\r
-import javax.imageio.ImageWriter;\r
-import javax.imageio.event.IIOWriteWarningListener;\r
-import javax.imageio.stream.ImageInputStream;\r
-import javax.imageio.stream.ImageOutputStream;\r
-import javax.swing.JFileChooser;\r
-import javax.swing.JFrame;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.filechooser.FileFilter;\r
-\r
-import charactermanaj.ui.UkagakaConvertDialog;\r
-import charactermanaj.util.LocalizedResourcePropertyLoader;\r
-\r
-/**\r
- * 伺か用PNG/PNA出力ヘルパ.\r
- * @author seraphy\r
- *\r
- */\r
-public class UkagakaImageSaveHelper {\r
-       \r
-       /**\r
-        * ロガー\r
-        */\r
-       private static final Logger logger = Logger.getLogger(UkagakaImageSaveHelper.class.getName());\r
-\r
-       /**\r
-        * リソース\r
-        */\r
-       protected static final String STRINGS_RESOURCE = "languages/ukagakaImageSaveHelper";\r
-\r
-       /**\r
-        * PNGファイルフィルタ\r
-        */\r
-       protected static final FileFilter pngFilter = new FileFilter() {\r
-               @Override\r
-               public boolean accept(File f) {\r
-                       return f.isDirectory() || f.getName().endsWith(".png");\r
-               }\r
-               @Override\r
-               public String getDescription() {\r
-                       return "PNG(*.png)";\r
-               }\r
-       };\r
-\r
-       /**\r
-        * 最後に開いたディレクトリ.<br>\r
-        * まだ使用していなければnull.<br>\r
-        */\r
-       protected File lastUseOpenDir;\r
-       \r
-       /**\r
-        * 最後に保存したディレクトリ.<br>\r
-        * まだ使用していなければnull.<br>\r
-        */\r
-       protected File lastUseSaveDir;\r
-       \r
-       /**\r
-        * 最後に保存したファイル名\r
-        */\r
-       protected String lastUseSaveName = "surface";\r
-\r
-       /**\r
-        * 最後に使用した透過色キー.<br>\r
-        * まだ使用していなければnull.<br>\r
-        */\r
-       protected Color transparentColorKey;\r
-       \r
-       /**\r
-        * 最後に使用した透過色キーモード.\r
-        */\r
-       protected boolean autoTransparentColor = true;\r
-       \r
-       /**\r
-        * コンストラクタ\r
-        */\r
-       public UkagakaImageSaveHelper() {\r
-               Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()\r
-                       .getLocalizedProperties(STRINGS_RESOURCE);\r
-\r
-               lastUseSaveName = strings.getProperty("default.lastUseSaveName"); \r
-       }\r
-       \r
-       protected JFileChooser createFileChooser(final boolean save) {\r
-               JFileChooser fileChooser = new JFileChooser() {\r
-                       private static final long serialVersionUID = 1L;\r
-\r
-                       @Override\r
-                       public void approveSelection() {\r
-                               File outFile = getSelectedFile();\r
-                               if (outFile == null) {\r
-                                       return;\r
-                               }\r
-                               \r
-                               String lcName = outFile.getName().toLowerCase();\r
-                               FileFilter selfilter = getFileFilter();\r
-                               if (selfilter == pngFilter) {\r
-                                       if (!lcName.endsWith(".png")) {\r
-                                               outFile = new File(outFile.getPath() + ".png");\r
-                                               setSelectedFile(outFile);\r
-                                       }\r
-                               }\r
-\r
-                               if (save && outFile.exists()) {\r
-                                       Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()\r
-                                               .getLocalizedProperties(STRINGS_RESOURCE);\r
-\r
-                                       if (JOptionPane.showConfirmDialog(this,\r
-                                                       strings.getProperty("confirmOverwrite"),\r
-                                                       strings.getProperty("confirm"),\r
-                                                       JOptionPane.YES_NO_OPTION,\r
-                                                       JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION) {\r
-                                               return;\r
-                                       }\r
-                               }\r
-                               super.approveSelection();\r
-                       }\r
-               };\r
-\r
-               if (lastUseSaveDir != null) {\r
-                       fileChooser.setCurrentDirectory(lastUseSaveDir);\r
-               }\r
-               \r
-               fileChooser.setFileFilter(pngFilter);\r
-               if ( !save) {\r
-                       fileChooser.setAcceptAllFileFilterUsed(false);\r
-               }\r
-               fileChooser.addChoosableFileFilter(pngFilter);\r
-               \r
-               return fileChooser;\r
-       }\r
-       \r
-       /**\r
-        * 透過画像(TYPE_INT_ARGB)から、伺か用のPNG/PNAファイルに出力する.\r
-        * @param parent 親フレーム\r
-        * @param img 対象イメージ\r
-        * @param colorKey マニュアル指定時の候補(前回のものを優先)\r
-        * @throws IOException 出力に失敗した場合\r
-        */\r
-       public void save(JFrame parent, BufferedImage img, Color colorKey) throws IOException {\r
-               final UkagakaConvertDialog dlg = new UkagakaConvertDialog(parent);\r
-               if (!autoTransparentColor && transparentColorKey != null) {\r
-                       // 前回マニュアル透過色キー指定であれば、それを使う.\r
-                       colorKey = transparentColorKey;\r
-               }\r
-               dlg.setExportImage(img, colorKey);\r
-               dlg.setAutoTransparentColor(autoTransparentColor);\r
-               dlg.setSaveActionListener(new ActionListener() {\r
-                       public void actionPerformed(ActionEvent e) {\r
-                               JFileChooser fileChooser = createFileChooser(true);\r
-                               fileChooser.setSelectedFile(new File(lastUseSaveDir, lastUseSaveName));\r
-\r
-                               int ret = fileChooser.showSaveDialog(dlg);\r
-                               if (ret != JFileChooser.APPROVE_OPTION) {\r
-                                       return;\r
-                               }\r
-\r
-                               // 結果\r
-                               dlg.setResult(fileChooser.getSelectedFile());\r
-                               dlg.dispose();\r
-                       }\r
-               });\r
-               dlg.setVisible(true);\r
-               \r
-               File selectedFile = (File) dlg.getResult();\r
-               if (selectedFile == null) {\r
-                       return;\r
-               }\r
-               \r
-               lastUseSaveName = selectedFile.getName();\r
-               lastUseSaveDir = selectedFile.getParentFile();\r
-               \r
-               File pngFile = selectedFile;\r
-               File pnaFile = makePNAFileName(pngFile);\r
-\r
-               File[] outfiles = {pngFile, pnaFile};\r
-               BufferedImage[] outimages = {\r
-                               dlg.getOpaqueImage(),\r
-                               dlg.getAlphaImage()\r
-               };\r
-\r
-               savePNGImages(outfiles, outimages);\r
-       }\r
-\r
-       /**\r
-        * 複数のファイルとイメージを指定して書き込みます.<br>\r
-        * ファイルとイメージの個数は一致していなければなりません.<br>\r
-        * 同じ添え字のファイルに対して、その添え字のイメージが出力されます.<br>\r
-        * いずれかで失敗した場合、その時点で処理は打ち切られて例外が返されます.<br>\r
-        * (すでに出力されたファイル、もしくは書き込み中のファイルは放置されます.)<br>\r
-        * @param outfiles ファイルの配列\r
-        * @param outimages イメージの配列\r
-        * @throws IOException 失敗\r
-        */\r
-       protected void savePNGImages(File[] outfiles, BufferedImage[] outimages) throws IOException {\r
-               if (outfiles == null || outimages == null) {\r
-                       throw new IllegalArgumentException("引数にnullは指定でまきせん。");\r
-               }\r
-               if (outfiles.length != outimages.length) {\r
-                       throw new IllegalArgumentException("ファイルおよびイメージの個数は一致していなければなりません.");\r
-               }\r
-               \r
-               ImageWriter iw = ImageIO.getImageWritersByFormatName("png").next();\r
-               try {\r
-                       iw.addIIOWriteWarningListener(new IIOWriteWarningListener() {\r
-                               public void warningOccurred(ImageWriter source, int imageIndex,\r
-                                               String warning) {\r
-                                       logger.log(Level.WARNING, warning);\r
-                               }\r
-                       });\r
-\r
-                       for (int idx = 0; idx < outfiles.length; idx++) {\r
-                               File outfile = outfiles[idx];\r
-                               BufferedImage outimage = outimages[idx];\r
-                       \r
-                               BufferedOutputStream bos = new BufferedOutputStream(\r
-                                               new FileOutputStream(outfile));\r
-                               try {\r
-                                       ImageWriteParam iwp = iw.getDefaultWriteParam();\r
-                                       IIOImage ioimg = new IIOImage(outimage, null, null);\r
-                                       \r
-                                       ImageOutputStream imgstm = ImageIO.createImageOutputStream(bos);\r
-                                       try {\r
-                                               iw.setOutput(imgstm);\r
-                                               iw.write(null, ioimg, iwp);\r
-                                       \r
-                                       } finally {\r
-                                               imgstm.close();\r
-                                       }\r
-                                       \r
-                               } finally {\r
-                                       bos.close();\r
-                               }\r
-                       }\r
-\r
-               } finally {\r
-                       iw.dispose();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * 複数ファイルを指定して既存のファイルから伺かPNG/PNAに変換して出力する.(ユーテリティ)\r
-        * @param parent 親フレーム\r
-        * @param colorKey 透過色キー(候補)\r
-        * @throws IOException 失敗\r
-        */\r
-       public void convertChooseFiles(JFrame parent, Color colorKey) throws IOException {\r
-               JFileChooser fileChooser = createFileChooser(false);\r
-               fileChooser.setCurrentDirectory(lastUseOpenDir);\r
-               fileChooser.setMultiSelectionEnabled(true);\r
-               \r
-               int ret = fileChooser.showOpenDialog(parent);\r
-               if (ret != JFileChooser.APPROVE_OPTION) {\r
-                       return;\r
-               }\r
-\r
-               // 選択したディレクトリを記憶する.\r
-               File[] files = fileChooser.getSelectedFiles();\r
-               if (files == null || files.length == 0) {\r
-                       return;\r
-               }\r
-               lastUseOpenDir = files[0].getParentFile();\r
-               \r
-               final UkagakaConvertDialog dlg = new UkagakaConvertDialog(parent, null, true);\r
-               if (!autoTransparentColor && transparentColorKey != null) {\r
-                       // 前回マニュアル透過色キー指定であれば、それを使う.\r
-                       colorKey = transparentColorKey;\r
-               }\r
-               dlg.setAutoTransparentColor(autoTransparentColor);\r
-\r
-               ImageReader ir = ImageIO.getImageReadersByFormatName("png").next();\r
-               try {\r
-                       for (final File file : files) {\r
-                               String fname = file.getName();\r
-                               \r
-                               ImageReadParam param = ir.getDefaultReadParam();\r
-                               \r
-                               BufferedImage img;\r
-                               ImageInputStream iis = ImageIO.createImageInputStream(file);\r
-                               try {\r
-                                       ir.setInput(iis);\r
-                                       img = ir.read(0, param);\r
-\r
-                               } finally {\r
-                                       iis.close();\r
-                               }\r
-                               \r
-                               img = convertIntARGB(img);\r
-\r
-                               dlg.setCaption(fname);\r
-                               dlg.setExportImage(img, colorKey);\r
-                               dlg.setSaveActionListener(new ActionListener() {\r
-                                       public void actionPerformed(ActionEvent e) {\r
-                                               if ( !dlg.isOverwriteOriginalFile()) {\r
-                                                       JFileChooser fileChooser = createFileChooser(true);\r
-                                                       fileChooser.setCurrentDirectory(file.getParentFile());\r
-                                                       fileChooser.setSelectedFile(file);\r
-\r
-                                                       int ret = fileChooser.showSaveDialog(dlg);\r
-                                                       if (ret != JFileChooser.APPROVE_OPTION) {\r
-                                                               return;\r
-                                                       }\r
-\r
-                                                       // 選択結果\r
-                                                       dlg.setResult(fileChooser.getSelectedFile());\r
-\r
-                                               } else {\r
-                                                       // ソースと同じ (上書き)\r
-                                                       dlg.setResult(file);\r
-                                               }\r
-\r
-                                               dlg.dispose();\r
-                                       }\r
-                               });\r
-                               dlg.setVisible(true);\r
-                               \r
-                               File selectedFile = (File) dlg.getResult();\r
-                               if (selectedFile == null) {\r
-                                       // キャンセルされた場合\r
-                                       break;\r
-                               }\r
-\r
-                               File pngFile = selectedFile;\r
-                               File pnaFile = makePNAFileName(pngFile);\r
-\r
-                               File[] outfiles = {pngFile, pnaFile};\r
-                               BufferedImage[] outimages = {\r
-                                               dlg.getOpaqueImage(),\r
-                                               dlg.getAlphaImage()\r
-                               };\r
-\r
-                               savePNGImages(outfiles, outimages);\r
-                       }\r
-                       \r
-               } finally {\r
-                       ir.dispose();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * BufferedImageをINT_TYPE_ARGBに設定する.<br>\r
-        * @param img イメージ\r
-        * @return 形式をINT_ARGBに変換されたイメージ\r
-        */\r
-       protected BufferedImage convertIntARGB(BufferedImage img) {\r
-               if (img == null || img.getType() == BufferedImage.TYPE_INT_ARGB) {\r
-                       // nullであるか、変換不要であれば、そのまま返す.\r
-                       return img;\r
-               }\r
-               \r
-               int w = img.getWidth();\r
-               int h = img.getHeight();\r
-               \r
-               BufferedImage dst = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);\r
-               Graphics2D g = dst.createGraphics();\r
-               try {\r
-                       g.drawImage(img, 0, 0, w, h, 0, 0, w, h, null);\r
-                       \r
-               } finally {\r
-                       g.dispose();\r
-               }\r
-               \r
-               return dst;\r
-       }\r
-               \r
-       \r
-       /**\r
-        * 拡張子をPNAに変換して返す.\r
-        * @param pngFile PNGファイル名\r
-        * @return PNAファイル名\r
-        */\r
-       protected File makePNAFileName(File pngFile) {\r
-               if (pngFile == null) {\r
-                       return null;\r
-               }\r
-               String fname = pngFile.getName();\r
-               int extpos = fname.lastIndexOf('.');\r
-               if (extpos >= 0) {\r
-                       fname = fname.substring(0, extpos);\r
-               }\r
-               fname += ".pna";\r
-               return new File(pngFile.getParent(), fname);\r
-       }\r
-}\r
-\r
+package charactermanaj.graphics.io;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.image.BufferedImage;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReadParam;
+import javax.imageio.ImageReader;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.event.IIOWriteWarningListener;
+import javax.imageio.stream.ImageInputStream;
+import javax.imageio.stream.ImageOutputStream;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.filechooser.FileFilter;
+
+import charactermanaj.ui.UkagakaConvertDialog;
+import charactermanaj.util.LocalizedResourcePropertyLoader;
+
+/**
+ * 伺か用PNG/PNA出力ヘルパ.
+ * @author seraphy
+ *
+ */
+public class UkagakaImageSaveHelper {
+       
+       /**
+        * ロガー
+        */
+       private static final Logger logger = Logger.getLogger(UkagakaImageSaveHelper.class.getName());
+
+       /**
+        * リソース
+        */
+       protected static final String STRINGS_RESOURCE = "languages/ukagakaImageSaveHelper";
+
+       /**
+        * PNGファイルフィルタ
+        */
+       protected static final FileFilter pngFilter = new FileFilter() {
+               @Override
+               public boolean accept(File f) {
+                       return f.isDirectory() || f.getName().endsWith(".png");
+               }
+               @Override
+               public String getDescription() {
+                       return "PNG(*.png)";
+               }
+       };
+
+       /**
+        * 最後に開いたディレクトリ.<br>
+        * まだ使用していなければnull.<br>
+        */
+       protected File lastUseOpenDir;
+       
+       /**
+        * 最後に保存したディレクトリ.<br>
+        * まだ使用していなければnull.<br>
+        */
+       protected File lastUseSaveDir;
+       
+       /**
+        * 最後に保存したファイル名
+        */
+       protected String lastUseSaveName = "surface";
+
+       /**
+        * 最後に使用した透過色キー.<br>
+        * まだ使用していなければnull.<br>
+        */
+       protected Color transparentColorKey;
+       
+       /**
+        * 最後に使用した透過色キーモード.
+        */
+       protected boolean autoTransparentColor = true;
+       
+       /**
+        * コンストラクタ
+        */
+       public UkagakaImageSaveHelper() {
+               Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
+                       .getLocalizedProperties(STRINGS_RESOURCE);
+
+               lastUseSaveName = strings.getProperty("default.lastUseSaveName"); 
+       }
+       
+       protected JFileChooser createFileChooser(final boolean save) {
+               JFileChooser fileChooser = new JFileChooser() {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public void approveSelection() {
+                               File outFile = getSelectedFile();
+                               if (outFile == null) {
+                                       return;
+                               }
+                               
+                               String lcName = outFile.getName().toLowerCase();
+                               FileFilter selfilter = getFileFilter();
+                               if (selfilter == pngFilter) {
+                                       if (!lcName.endsWith(".png")) {
+                                               outFile = new File(outFile.getPath() + ".png");
+                                               setSelectedFile(outFile);
+                                       }
+                               }
+
+                               if (save && outFile.exists()) {
+                                       Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
+                                               .getLocalizedProperties(STRINGS_RESOURCE);
+
+                                       if (JOptionPane.showConfirmDialog(this,
+                                                       strings.getProperty("confirmOverwrite"),
+                                                       strings.getProperty("confirm"),
+                                                       JOptionPane.YES_NO_OPTION,
+                                                       JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION) {
+                                               return;
+                                       }
+                               }
+                               super.approveSelection();
+                       }
+               };
+
+               if (lastUseSaveDir != null) {
+                       fileChooser.setCurrentDirectory(lastUseSaveDir);
+               }
+               
+               fileChooser.setFileFilter(pngFilter);
+               if ( !save) {
+                       fileChooser.setAcceptAllFileFilterUsed(false);
+               }
+               fileChooser.addChoosableFileFilter(pngFilter);
+               
+               return fileChooser;
+       }
+       
+       /**
+        * 透過画像(TYPE_INT_ARGB)から、伺か用のPNG/PNAファイルに出力する.
+        * @param parent 親フレーム
+        * @param img 対象イメージ
+        * @param colorKey マニュアル指定時の候補(前回のものを優先)
+        * @throws IOException 出力に失敗した場合
+        */
+       public void save(JFrame parent, BufferedImage img, Color colorKey) throws IOException {
+               final UkagakaConvertDialog dlg = new UkagakaConvertDialog(parent);
+               if (!autoTransparentColor && transparentColorKey != null) {
+                       // 前回マニュアル透過色キー指定であれば、それを使う.
+                       colorKey = transparentColorKey;
+               }
+               dlg.setExportImage(img, colorKey);
+               dlg.setAutoTransparentColor(autoTransparentColor);
+               dlg.setSaveActionListener(new ActionListener() {
+                       public void actionPerformed(ActionEvent e) {
+                               JFileChooser fileChooser = createFileChooser(true);
+                               fileChooser.setSelectedFile(new File(lastUseSaveDir, lastUseSaveName));
+
+                               int ret = fileChooser.showSaveDialog(dlg);
+                               if (ret != JFileChooser.APPROVE_OPTION) {
+                                       return;
+                               }
+
+                               // 結果
+                               dlg.setResult(fileChooser.getSelectedFile());
+                               dlg.dispose();
+                       }
+               });
+               dlg.setVisible(true);
+               
+               File selectedFile = (File) dlg.getResult();
+               if (selectedFile == null) {
+                       return;
+               }
+               
+               lastUseSaveName = selectedFile.getName();
+               lastUseSaveDir = selectedFile.getParentFile();
+               
+               File pngFile = selectedFile;
+               File pnaFile = makePNAFileName(pngFile);
+
+               File[] outfiles = {pngFile, pnaFile};
+               BufferedImage[] outimages = {
+                               dlg.getOpaqueImage(),
+                               dlg.getAlphaImage()
+               };
+
+               savePNGImages(outfiles, outimages);
+       }
+
+       /**
+        * 複数のファイルとイメージを指定して書き込みます.<br>
+        * ファイルとイメージの個数は一致していなければなりません.<br>
+        * 同じ添え字のファイルに対して、その添え字のイメージが出力されます.<br>
+        * いずれかで失敗した場合、その時点で処理は打ち切られて例外が返されます.<br>
+        * (すでに出力されたファイル、もしくは書き込み中のファイルは放置されます.)<br>
+        * @param outfiles ファイルの配列
+        * @param outimages イメージの配列
+        * @throws IOException 失敗
+        */
+       protected void savePNGImages(File[] outfiles, BufferedImage[] outimages) throws IOException {
+               if (outfiles == null || outimages == null) {
+                       throw new IllegalArgumentException("引数にnullは指定でまきせん。");
+               }
+               if (outfiles.length != outimages.length) {
+                       throw new IllegalArgumentException("ファイルおよびイメージの個数は一致していなければなりません.");
+               }
+               
+               ImageWriter iw = ImageIO.getImageWritersByFormatName("png").next();
+               try {
+                       iw.addIIOWriteWarningListener(new IIOWriteWarningListener() {
+                               public void warningOccurred(ImageWriter source, int imageIndex,
+                                               String warning) {
+                                       logger.log(Level.WARNING, warning);
+                               }
+                       });
+
+                       for (int idx = 0; idx < outfiles.length; idx++) {
+                               File outfile = outfiles[idx];
+                               BufferedImage outimage = outimages[idx];
+                       
+                               BufferedOutputStream bos = new BufferedOutputStream(
+                                               new FileOutputStream(outfile));
+                               try {
+                                       ImageWriteParam iwp = iw.getDefaultWriteParam();
+                                       IIOImage ioimg = new IIOImage(outimage, null, null);
+                                       
+                                       ImageOutputStream imgstm = ImageIO.createImageOutputStream(bos);
+                                       try {
+                                               iw.setOutput(imgstm);
+                                               iw.write(null, ioimg, iwp);
+                                       
+                                       } finally {
+                                               imgstm.close();
+                                       }
+                                       
+                               } finally {
+                                       bos.close();
+                               }
+                       }
+
+               } finally {
+                       iw.dispose();
+               }
+       }
+       
+       /**
+        * 複数ファイルを指定して既存のファイルから伺かPNG/PNAに変換して出力する.(ユーテリティ)
+        * @param parent 親フレーム
+        * @param colorKey 透過色キー(候補)
+        * @throws IOException 失敗
+        */
+       public void convertChooseFiles(JFrame parent, Color colorKey) throws IOException {
+               JFileChooser fileChooser = createFileChooser(false);
+               fileChooser.setCurrentDirectory(lastUseOpenDir);
+               fileChooser.setMultiSelectionEnabled(true);
+               
+               int ret = fileChooser.showOpenDialog(parent);
+               if (ret != JFileChooser.APPROVE_OPTION) {
+                       return;
+               }
+
+               // 選択したディレクトリを記憶する.
+               File[] files = fileChooser.getSelectedFiles();
+               if (files == null || files.length == 0) {
+                       return;
+               }
+               lastUseOpenDir = files[0].getParentFile();
+               
+               final UkagakaConvertDialog dlg = new UkagakaConvertDialog(parent, null, true);
+               if (!autoTransparentColor && transparentColorKey != null) {
+                       // 前回マニュアル透過色キー指定であれば、それを使う.
+                       colorKey = transparentColorKey;
+               }
+               dlg.setAutoTransparentColor(autoTransparentColor);
+
+               ImageReader ir = ImageIO.getImageReadersByFormatName("png").next();
+               try {
+                       for (final File file : files) {
+                               String fname = file.getName();
+                               
+                               ImageReadParam param = ir.getDefaultReadParam();
+                               
+                               BufferedImage img;
+                               ImageInputStream iis = ImageIO.createImageInputStream(file);
+                               try {
+                                       ir.setInput(iis);
+                                       img = ir.read(0, param);
+
+                               } finally {
+                                       iis.close();
+                               }
+                               
+                               img = convertIntARGB(img);
+
+                               dlg.setCaption(fname);
+                               dlg.setExportImage(img, colorKey);
+                               dlg.setSaveActionListener(new ActionListener() {
+                                       public void actionPerformed(ActionEvent e) {
+                                               if ( !dlg.isOverwriteOriginalFile()) {
+                                                       JFileChooser fileChooser = createFileChooser(true);
+                                                       fileChooser.setCurrentDirectory(file.getParentFile());
+                                                       fileChooser.setSelectedFile(file);
+
+                                                       int ret = fileChooser.showSaveDialog(dlg);
+                                                       if (ret != JFileChooser.APPROVE_OPTION) {
+                                                               return;
+                                                       }
+
+                                                       // 選択結果
+                                                       dlg.setResult(fileChooser.getSelectedFile());
+
+                                               } else {
+                                                       // ソースと同じ (上書き)
+                                                       dlg.setResult(file);
+                                               }
+
+                                               dlg.dispose();
+                                       }
+                               });
+                               dlg.setVisible(true);
+                               
+                               File selectedFile = (File) dlg.getResult();
+                               if (selectedFile == null) {
+                                       // キャンセルされた場合
+                                       break;
+                               }
+
+                               File pngFile = selectedFile;
+                               File pnaFile = makePNAFileName(pngFile);
+
+                               File[] outfiles = {pngFile, pnaFile};
+                               BufferedImage[] outimages = {
+                                               dlg.getOpaqueImage(),
+                                               dlg.getAlphaImage()
+                               };
+
+                               savePNGImages(outfiles, outimages);
+                       }
+                       
+               } finally {
+                       ir.dispose();
+               }
+       }
+       
+       /**
+        * BufferedImageをINT_TYPE_ARGBに設定する.<br>
+        * @param img イメージ
+        * @return 形式をINT_ARGBに変換されたイメージ
+        */
+       protected BufferedImage convertIntARGB(BufferedImage img) {
+               if (img == null || img.getType() == BufferedImage.TYPE_INT_ARGB) {
+                       // nullであるか、変換不要であれば、そのまま返す.
+                       return img;
+               }
+               
+               int w = img.getWidth();
+               int h = img.getHeight();
+               
+               BufferedImage dst = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+               Graphics2D g = dst.createGraphics();
+               try {
+                       g.drawImage(img, 0, 0, w, h, 0, 0, w, h, null);
+                       
+               } finally {
+                       g.dispose();
+               }
+               
+               return dst;
+       }
+               
+       
+       /**
+        * 拡張子をPNAに変換して返す.
+        * @param pngFile PNGファイル名
+        * @return PNAファイル名
+        */
+       protected File makePNAFileName(File pngFile) {
+               if (pngFile == null) {
+                       return null;
+               }
+               String fname = pngFile.getName();
+               int extpos = fname.lastIndexOf('.');
+               if (extpos >= 0) {
+                       fname = fname.substring(0, extpos);
+               }
+               fname += ".pna";
+               return new File(pngFile.getParent(), fname);
+       }
+}
+