Java システムアイコンを抽出
Javaで、指定されたファイルのアイコンを png 形式の画像ファイルへ抽出するサンプルプログラムを紹介します。指定するファイルは 拡張子 exe 等の実行ファイルや、dll、xls、doc 等何でも抽出できます。
同様の方法をインターネットで色々と調べたのですが、見あたりませんでした。
ですが実に簡単に取得出来る方法を発見しましたので紹介します。
尚、Chat&Messengerではこの方法を、付箋にファイルを添付する機能で利用しています。
サンプルプログラム動作確認
サンプルを実行
※ jar ファイルが関連づいている場合、実行できます。
- サンプルソースを取得し、コンパイルして実行してください。
- 起動するとメインウィンドウが開きますので、抽出したいアイコンをそのままウィンドウへドラッグ&ドロップしてください。
   
- 元のアインコンと同じ場所へ、png 形式の画像ファイルが出力されます。
   
サンプルプログラム解説
Javaでアイコンを抽出する処理を、以下の方法で実現してます。
- 
Look & Feel を Windows に設定します。
 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- ドラッグ&ドロップで取得したファイルを javax.swing.JFileChooser.getIcon() メソッドで javax.swing.Icon オブジェクトに変換します。
- javax.imageio.ImageIO.write() メソッドで Icon オブジェクトを png 形式の画像ファイルへ出力します。
サンプルプログラム
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
public class IconExtractor extends JFrame
                implements DropTargetListener {
    private JPanel jContentPane = null;
    private JLabel jLabel = null;
    private JFileChooser chooser;
    public static void main(String[] args) {
        IconExtractor extractor = new IconExtractor();
        extractor.setVisible(true);
    }
    public IconExtractor() {
        super();
        try {
            UIManager.setLookAndFeel(
                    UIManager.getSystemLookAndFeelClassName());
            chooser = new JFileChooser();
        } catch (Exception e) {
            e.printStackTrace();
        }
        initialize();
    }
    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle(“アイコン抽出”);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jLabel = new JLabel();
            jLabel.setText(“アイコンをドラッグしてください。”);
            jLabel.setBackground(Color.white);
            jLabel.setHorizontalAlignment(SwingConstants.CENTER);
            jLabel.setOpaque(true);
            new DropTarget(jLabel,
                    DnDConstants.ACTION_COPY_OR_MOVE, this);
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(jLabel, BorderLayout.CENTER);
        }
        return jContentPane;
    }
    // — implements DropTargetListener —————————-
    public void drop(DropTargetDropEvent dtde) {
        dtde.acceptDrop(DnDConstants.ACTION_MOVE);
        try {
Transferable tran = dtde.getTransferable();
            List fileList = (List) tran
                    .getTransferData(DataFlavor.javaFileListFlavor);
            Iterator iterator = fileList.iterator();
            while (iterator.hasNext()) {
                File file = (File) iterator.next();
                ImageIcon icon = (ImageIcon) chooser.getIcon(file);
                String ext = file.getAbsoluteFile() + “.png”;
                // 画像ファイル保存
                ImageIO.write((BufferedImage) icon.getImage(), “png”,
                        new File(ext));
                jLabel.setText(“<html>抽出完了<br>” + ext);
                setIconImage(icon.getImage());
            }
            dtde.dropComplete(true);
        } catch (Exception e) {
            e.printStackTrace();
            dtde.dropComplete(false);
        }
    }
    public void dragEnter(DropTargetDragEvent e) {
    }
    public void dragOver(DropTargetDragEvent e) {
    }
    public void dropActionChanged(DropTargetDragEvent e) {
    }
    public void dragExit(DropTargetEvent e) {
    }
}










 
