-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);
+ }
+}
+