2013年12月10日火曜日

Javaによる画像入出力プログラム

ちょっとWindowsの画面をキャプチャする機能が欲しくなったんで、調べてみたんですが、、、、いろんな関数があって大変(;゜ロ゜)
手動でやれば簡単なんですが、枚数があるもんですからプログラムと思ったんですけどね。しばし考えて、「Javaにも同じような機能あるんじゃない?」調べたらありました。しかも非常に簡単です。

キャプチャ自体は以下の関数になります。

// 指定領域をキャプチャしてスクリーンショットのBufferedImageを返す createScreenCapture(Rectangle screenRect);

それで簡単に画面の一部(左上の512x512)をファイルに保存するものを作ってみました。

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class test {

 /**
  * @param args
  */
 public static void main(String[] args) {

  // スクリーンキャプチャのテスト
  Robot r =null;
  try {
   r = new Robot();
  } catch (Exception e){
   System.out.println("can't get Robot");
  }

  BufferedImage dd = r.createScreenCapture(new Rectangle(0, 0, 512, 512));

  // jpgで保存
  try {
   File savedImage = new File("sss.jpg");
   ImageIO.write(dd, "jpg", savedImage);
  } catch (Exception e) {
   System.out.println("can't write file");
  }

 }

}

このプログラムはファイルを作成するだけですが、読み込むときは以下の通りになります。

BufferedImage img = ImageIO.read(File);

後は、BufferedImageで適当に調べればpixel単位の操作も簡単にできます。


PS:
あ、念のためいっときますが、これはローカルでjavaを動かして自分のPCの画面をキャプチャしたい目的で調べました。(ですからローカルに画像ファイルを保存しちゃってますし)リモートでこれ実行したらどうなるんでしょうねえ?セキュリティにひっかかるかな。(それにBufferedImageデータをどうやって返信するんだという問題がありますが。取得したイメージデータを返信する方法がなければゲームなんかで使えるテクニックなんですが。)

0 件のコメント:

コメントを投稿