« Cygwin 1.7.1 | トップページ | GPS ロガーを追加 »

2010年1月 9日 (土曜日)

クリップボードの画像を楽チンに保存し鯛…

Windows で画面のスナップショットを撮る場合、キーボードから…

PrtSc (Print Screen) フルスクリーンのキャプチャ
Alt + PrtSc (Print Screen) アクティブウィンドウのキャプチャ

…で、キャプチャした画像がクリップボードに格納されますよね。

今までは、上記のショートカットキーでクリップボードに取り込んだ画像を、 XnView などを立ち上げてファイルに保存してました。これでも大したストレスは無かったんですけど…。

もっとサクッとファイルに保存し鯛…と、思って ruby で書いてみました。
下記スクリプトは gem でインストールした win32-clipboard を使っています。
クリップボードに画像が格納されている場合のみ、ファイルに保存されます。 Excel のグラフやセルの内容も画像として保存できるようです。

#!/usr/bin/ruby
# $Id: $
# tiny script to save image data in clipboard.

require 'rubygems'
require 'win32/clipboard'

DEF_clip2png_file = 'clipboard.png' # default filename to output

filename = String.new
if ENV['clip2png_file'] # environment variable 'clip2png_file' exists?
  filename = ENV['clip2png_file'] # then use it
else
  filename = DEF_clip2png_file # else use the default file name.
end

if Win32::Clipboard.format_available?(Win32::Clipboard::DIB) # clipboard contains image data ?
  File.open(filename, 'wb') { |file| # then save the data into a file
    file.write Win32::Clipboard.data(Win32::Clipboard::DIB)
  }
end

環境変数 'clip2png_file' で保存先ファイルが指定してあれば、そのファイル名で保存されます。指定していなければデフォルトの 'clipboard.png' というファイル名で保存されます。
スクリプトをショートカットから実行する場合は、プロパティで開始フォルダを指定しておけば、そこに保存されます。

実はまだ全然理解していませんが、ファイル名の拡張子を png にすれば png で、 jpg にすれば jpeg で、 bmp にすれば Windows bitmap の形式で保存されるようです(ホント?)。他の拡張子は試してません。 2010/02/01 追記: やっぱりどうも勘違いみたいでした…トホホ

当初、キャプチャ → 保存をまとめて自動化したいと思って、下記のように Print Screen や Alt + Print Screen のキーイベントも送信してしまおうか…と思いましたが、 Excel などからコピーしたデータを使う場合を考えて、シンプルにしておくことにしますた…というメモ。

あ、動作確認は取り敢えず WinXP Professional SP2 と下記2種類の ruby の組み合わせです。
ruby 1.8.5 (2006-08-25) [i386-mswin32]
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]

追記:
ruby 1.8.7 (2009-12-24 patchlevel 248) [i386-mswin32] でも当然ながら動作しました。

require 'Win32API'

VK_SNAPSHOT           = 0x2C # PrintScreen
VK_LMENU              = 0xA4 # Left Alt

KEYEVENTF_KEYUP       = 2    # Key up flag
KEYEVENTF_EXTENDEDKEY = 1    # Extended scan code flag

# VOID keybd_event(
#   BYTE bVk,               // Virtual Keycode
#   BYTE bScan,             // Hardware Scancode
#   DWORD dwFlags,          // Flags
#   ULONG_PTR dwExtraInfo   // Additional Keystroke data
# );
keybd_event = Win32API.new('user32', 'keybd_event', %w(i i i p), 'v')
# send PrtSc event (capture whole screen)
keybd_event.call(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY | 0, 0)
keybd_event.call(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0)
# send Alt + PrtSc event (capture active window)
keybd_event.call(VK_LMENU,    0, KEYEVENTF_EXTENDEDKEY | 0, 0)
keybd_event.call(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY | 0, 0)
keybd_event.call(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0)
keybd_event.call(VK_LMENU,    0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0)

|

« Cygwin 1.7.1 | トップページ | GPS ロガーを追加 »

スクリプティング」カテゴリの記事

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/144752/47241028

この記事へのトラックバック一覧です: クリップボードの画像を楽チンに保存し鯛…:

« Cygwin 1.7.1 | トップページ | GPS ロガーを追加 »