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) {
}
}