プリントスクリーンでキャプチャしたイメージをクリップボードからとりだして、ファイルに保存します。 2010/01/30

Javaです。
Windowsで動作するSWTアプリです。
動作確認WindowsXPで行ってます。

プリントスクリーンでキャプチャしたイメージをクリップボードからとりだして、ファイルに保存します。

eclipseのswtを使ってタスクトレイに格納したアイコンを左クリックすると保存するという風にしてみました。
アイコンを右クリックで、保存するフォルダを設定できます。
イメージファイルはPNG形式で、ファイル名はタイムスタンプでつけてます。

タスクトレイのアイコンを左クリックで一発保存というのはいいアイデアだと思うんだけど、どうかな。
すでにありそうだけど....

作成するために調べた項目。

  • Javaでクリップボードからイメージのとりだし
  • SWTを使ってタスクトレイに格納
  • SWTでファイルダイアログ
  • バルーンを表示




かなりわかりづらいスクリーンキャストですが、とりあえずアップします。


ソースコードちょっと長め。
タスクトレイに表示するアイコン(ico)はペイントでちょいちょい作ってbmpで保存してicoに拡張子を書きかえ。

package capture;

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolTip;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;

import capture.test.TestTray;

public class Main {

public static void main(String[] args) {
a();
}

static void a2() {
try {
a();
} finally {
System.exit(0);
}
}

/**
* クリップボードのイメージを取得します。
*
* @return
*/
static BufferedImage getClipboardImage() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Clipboard clipboard = toolkit.getSystemClipboard();
try {
return (BufferedImage) clipboard.getData(DataFlavor.imageFlavor);
} catch (UnsupportedFlavorException e) {
return null;
} catch (IOException e) {
return null;
}
}

/**
* Windows
*
* @return
*/
static File getDesktopPath() {
File dir = null;
{
String user = System.getProperty("user.name");
String s = "C:\\Documents and Settings\\" + user + "\\デスクトップ\\";
dir = new File(s);
}
return dir;
}

static void a() {

final Shell shell = new Shell();
shell.setSize(600, 400);
shell.setText("Save Clipboard Image");

final ToolTip toolTip = new ToolTip(shell, SWT.BALLOON
| SWT.ICON_INFORMATION);
// 自動で消える
toolTip.getAutoHide();
SelectionAdapter selectionAdapter = new SelectionAdapter() {

File DIR = getDesktopPath();

public void widgetSelected(SelectionEvent event) {
// System.out.println("*** " + event.getSource());
if (event.getSource() instanceof MenuItem) {
// System.out.println("*** "
// + ((MenuItem) event.getSource()).getText());

DirectoryDialog dialog = new DirectoryDialog(shell);
String path = dialog.open();
System.out.println("*** select path:" + path);
if (path != null) {
DIR = new File(path);
}
// MessageBox mesBox = new MessageBox(shell);
// mesBox.setMessage(path);
// mesBox.open();
} else if (event.getSource() instanceof TrayItem) {

BufferedImage image = getClipboardImage();
if (image != null) {
// 保存
SimpleDateFormat format = new SimpleDateFormat(
"yyyyMMdd-hhmmss");
String s = "cap_" + format.format(new Date());

try {
File f = new File(DIR, s + ".png");
ImageIO.write(image, "png", f);

toolTip.setText("メッセージ");
toolTip.setMessage("保存しました。\n"
+ f.getAbsolutePath());
toolTip.setVisible(true);

} catch (IOException e) {
e.printStackTrace();
}
}
}
}
};

final Menu menu = new Menu(shell);
shell.setMenu(menu);

final MenuItem menuItemHelp = new MenuItem(menu, SWT.NONE);
menuItemHelp.setText("ヘルプ");
menuItemHelp.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
MessageBox mesBox = new MessageBox(shell);
String s = "タスクトレイのアイコンを左クリックで保存します。\nデフォルトでデスクトップに保存です。";
mesBox.setMessage(s);
mesBox.open();
}
});

final MenuItem menuItemSettingSaveFolder = new MenuItem(menu, SWT.NONE);
menuItemSettingSaveFolder.setText("保存フォルダ設定");
menuItemSettingSaveFolder.addSelectionListener(selectionAdapter);
MenuItem exitMenuItem = new MenuItem(menu, SWT.NONE);
exitMenuItem.setText("終了");
exitMenuItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
shell.close();
}
});

Tray tray = shell.getDisplay().getSystemTray();
final Display display = shell.getDisplay();
TrayItem trayItem = new TrayItem(tray, SWT.NONE);
Image image = new Image(shell.getDisplay(), TestTray.class.getClass()
.getResourceAsStream("/capture/test/icon.ico"));
trayItem.setToolTipText("左クリックで保存。右クリックでメニュ表示。");
trayItem.setImage(image);

// バールん
trayItem.setToolTip(toolTip);

trayItem.addListener(SWT.Show, new Listener() {
public void handleEvent(Event event) {
System.out.println("show menu");
}
});

trayItem.addListener(SWT.Hide, new Listener() {
public void handleEvent(Event event) {
System.out.println("hide menu");
}
});

/*
* 左ボタン これで左ボタンクリックとれる。
*/
trayItem.addSelectionListener(selectionAdapter);

/*
* メニュー表示
*/
trayItem.addListener(SWT.MenuDetect, new Listener() {
public void handleEvent(Event event) {
// System.out.println("show menu");
menu.setVisible(true);
}
});

menuItemHelp.setEnabled(true);

while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}

display.dispose();
}

}

: