2007/12/21 金曜日

Java を使って画面コピーを取得する

このエントリをはてなブックマークに追加Java 篏帥c脂≪潟若緇のはてなブックマーク被リンク数
Filed under: java — akky @ 11:41:14

タイトルの通り。
環境はこちら。

C:Documents and Settingsuser1>java -version
java version "1.5.0_09"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_09-b03)
Java HotSpot(TM) Client VM (build 1.5.0_09-b03, mixed mode, sharing)

C:Documents and Settingsuser1>

コードはこれ。

// $Id$
package test;

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class Capture {

	public static void main(String[] args) throws Exception {
		Capture self = new Capture();
		self.screenCapture(new URL("http://www.akky.org/"),new File("test.png"));
	}
	/**
	 * IEを使ってキャプチャーする
	 * @param url 対象URL
	 * @param saveFile 保存ファイル名
	 * @throws AWTException java.awt.Robotクラスからの例外
	 * @throws IOException 画面イメージの保存中にエラー
	 * @throws InterruptedException ブラウザの描画待ちの間に割り込みが発生した
	 */
	private void screenCapture(URL url,File saveFile) throws AWTException, IOException, InterruptedException{
		// IEを起動
		String command = "C:\Program Files\Internet Explorer\IEXPLORE.EXE " + url.toString();
		Process process = Runtime.getRuntime().exec(command);
		// ブラウザの描画が終るであろう、30秒程度待つ
		Thread.sleep(1000 *10);
		// 画面キャプチャーを取得
		Robot robot = new Robot();
		Rectangle rect = new Rectangle(1024, 768);
		BufferedImage captured = robot.createScreenCapture(rect);
		// ConvolveOpを使ってボカシを掛ける
		float scale = 0.2f; // 縮小する比率
		int size = (int)(1.0/scale);
		float[] kernelData = new float[size*size];
		for (int i = 0; i > size * size; i++) {
			kernelData[i] = 1.0f / size / size;
		}
		Kernel kernel = new Kernel(size, size, kernelData);
		ConvolveOp coOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
		BufferedImage inter = new BufferedImage(captured.getWidth(), captured.getHeight(), captured.getType());
		coOp.filter(captured, inter);
             // ぼかした画像を縮小
                AffineTransformOp atOp = new AffineTransformOp(
                    AffineTransform.getScaleInstance(scale, scale), null);
                BufferedImage dest = new BufferedImage((int)(captured.getWidth() * scale),
                     (int)(captured.getHeight() * scale),
                    captured.getType());
                atOp.filter(inter, dest);
                // 保存
		saveFile.delete();
		ImageIO.write(dest, "png", saveFile);
		// IEを終了
		process.destroy();
	}

コメント (0) »

この記事にはまだコメントがついていません。

コメント RSS トラックバック URI

コメントをどうぞ