【コピペで使える】スクリーンキャプチャをファイル保存するクラスを作ってみました

当ページのリンクには広告が含まれています。

少し前に公開した「C#でスクリーン(画面) キャプチャするには」の記事で、スクリーンをキャプチャする方法と、スクリーンキャプチャクラス(ScreenCapture)を紹介しました。

その中で、キャプチャ画像をファイルに保存する方法について少しだけ触れました。

その後スクリーンキャプチャツールを自作する中で、キャプチャ画像のファイル保存を目的としたヘルパークラスを作成したので、紹介させていただきます。

なお、この記事の最後に紹介するソースコードは、ScreenCaptureクラスも含んでいますので、そのままコピペしてお使いいただけます。

目次

概要

ScreenCaptureSaver クラスは、 ScreenCaptureクラスを継承して作成しています。

基本的には ScreenCapture クラスで用意した以下の4つの機能について、取得したキャプチャ画像をそのままファイルに保存するメソッドを用意しています。

  • 指定区画のキャプチャ
  • プライマリスクリーンのキャプチャ
  • アクティブウィンドウのキャプチャ
  • スクリーン番号で指定したスクリーンのキャプチャ

更に、以下のメソッドを追加しています。

  • 指定区画のキャプチャ画像をクリップボードにコピー
  • クリップボードの画像をファイルに保存
  • 指定したBitmapイメージのファイル保存

キャプチャ画像を保存するためのファイル名については、指定フォルダに連番付きで次々と保存したいため、空き連番を探すようにしています(CreateFileNameメソッド)。

連番の開始番号はコンストラクタの引数で指定できますが、省略時は0から開始します。

クラスのリファレンス

ScreenCaptureSaverクラスのメソッドを一覧にまとめました。

Saveから始まるメソッドには、フォルダ名(folder)、ファイル名(fileName)、フォーマット(format)、イメ今回はイプ(imageType)、Jpeg品質(Quality)が指定できるようになっています。

コンストラクタかプロパティで指定できるようにすれば、各メソッドの引数を減らすことも可能ですが、今回はメソッドごとに指定するようにしています。

内容メソッド名と引数戻り値
コンストラクタScreenCaptureSaver(
int num=0 //ファイル連番の開始値
)
なし
指定区画のキャプチャ画像
をファイルに保存
void SaveRect(
int x1, int y1, int x2, int y2, //対象座標
string folder, //フォルダ名
string fileName, //ファイル名(拡張子は除く)
string format = "_{0:000}", //連番部のフォーマット
string imageType = "jpg", //イメージの種類
int quality = 100 //Jpgの品質
)
なし
全スクリーンのキャプチャ画像
をファイルに保存
void SaveAll(
string folder, //フォルダ名
string fileName, //ファイル名(拡張子は除く)
string format = "_{0:000}", //連番部のフォーマット
string imageType = "jpg", //イメージの種類
int quality = 100 //Jpgの品質
)
なし
プライマリスクリーンの
キャプチャ画像をファイルに保存
void SavePrymary(
string folder, //フォルダ名
string fileName, //ファイル名(拡張子は除く)
string format = "_{0:000}", //連番部のフォーマット
string imageType = "jpg", //イメージの種類
int quality = 100 //Jpgの品質
)
なし
アクティブウィンドウの
キャプチャ画像をファイルに保存
void SaveActive(
string folder, //フォルダ名
string fileName, //ファイル名(拡張子は除く)
string format = "_{0:000}", //連番部のフォーマット
string imageType = "jpg", //イメージの種類
int quality = 100 //Jpgの品質
)
なし
クリップボードの画像を
ファイルに保存
void SaveClipboard(
string folder, //フォルダ名
string fileName, //ファイル名(拡張子は除く)
string format = "_{0:000}", //連番部のフォーマット
string imageType = "jpg", //イメージの種類
int quality = 100 //Jpgの品質
)
なし
指定区画のキャプチャ画像を
クリップボードにコピー
void ToClipboard(
int x1, int y1, int x2, int y2 //対象座標
)
なし
指定したスクリーン番号の
キャプチャ画像をファイルに保存
void SaveScreen(
int no //スクリーン番号
string folder, //フォルダ名
string fileName, //ファイル名(拡張子は除く)
string format = "_{0:000}", //連番部のフォーマット
string imageType = "jpg", //イメージの種類
int quality = 100 //Jpgの品質
)
なし
指定したBitmapイメージを
ファイルに保存
void Save(
Bitmap img //Bitmapイメージ
string folder, //フォルダ名
string fileName, //ファイル名(拡張子は除く)
string format = "_{0:000}", //連番部のフォーマット
string imageType = "jpg", //イメージの種類
int quality = 100 //Jpgの品質
)
なし
指定したBitmapイメージを
ファイルに保存
void Save(
Bitmap img //Bitmapイメージ
string fileName, //ファイル名(拡張子は除く)
string imageType = "jpg", //連番部のイメージの種類
int quality = 100 //Jpgの品質
)
なし
連番を含むファイル名の生成string CreateFileName(
string folder, //フォルダ名
string fileName, //ファイル名(拡張子は除く)
string format = "_{0:000}", //連番部のフォーマット
string ext = "jpg" //拡張子
)
ファイル名

ソースコード一式

C#でスクリーン(画面) キャプチャするには」の記事で紹介した ScreenCapture クラスのソースコードを全て含んでいます。

ソースコードの前半が今回作成した ScreenCaptureSaverクラス、後半が ScreenCapture になっています。

クリップボードへのコピーについて

キャプチャ画像をクリップボードへコピーする処理については、キャプチャ画像を一時ファイルに保存した後で、それを再度読み込んでからクリップボードにセットするという回りくどい方法を採用しています。

本来は、次の1行で問題は無いなずなのですが、これだとクリップボードにセットした画像が、環境によってはノイズまみれになってしまう問題が発生しました。

別のPCで試したところ現象は発生しなかったので、私が使っている環境の問題かもしれませんが、回避策として見つけたのがファイルを経由してクリップボードにセットするという方法でした。

まとめ

今回は以前紹介した ScreenCaptureクラスを継承し、キャプチャ画像のファイル保存を行う ScreenCaptureSaverクラスを紹介しました。

私のブログ記事に掲載する画像を、効率的に行うためにスクリーンキャプチャツールを作ろうと思い、その延長上で今回のクラスが出来上がりました。

みなさんにとって、あまり必然性は無いかもしれませんが、もしプログラムでキャプチャ画像を簡単にファイル保存したいというニーズが発生したら、是非この記事を参考にしてください。

スクリーンキャプチャツールが完成した際には、また別の記事で紹介させていただきます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次