画面の部分拡大鏡(虫めがね)を作ってみよう3

 

とりあえず動くプログラムを作るのは比較的簡単です。
手間がかかる(面倒な)のは、異常処理(エラー処理)なのです。

毎度、イガジーです。

前回の画面部分拡大(虫めがね)プログラムを動かしてみると
マウスを画面の端(左端や上端など)にもっていくと、ゴミが出ると思います。
(OSやハードによって症状は異なるかもしれませんが)

マウス周辺を無条件にキャプチャーしているので、マウスの位置によっては
画面をはみ出した部分をキャプチャーしてしまうからです。
キャプチャー範囲の座標チェックを追加して、画面をはみ出ないようにするか、
キャプチャー後に、はみ出し部分を(黒などで)塗りつぶすといった処理を
追加すれば良いと思います。気になる方は挑戦してみてください。

はみ出し処理は省略して、中心点の色を#RRGGBBで表示するように
改良した例を掲載しておきます。

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.util.Timer;
import java.util.TimerTask;

public class MagnifyGlass {
	Frame f0;
	MyCanvas cv;
	Label l0;
	BufferedImage buf=null; //=new BufferedImage(80,80,BufferedImage.TYPE_INT_RGB);
	Robot rb=null;
	Timer tmr;
	int interval=500;

	MagnifyGlass(String as[]){
		f0=new Frame();
		f0.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
        });

		if (as.length>0) {
			try {
				int tt=Integer.parseInt(as[0]);
				if ((tt>0)&&(tt<50)) interval=tt*100;
			}catch(Exception ex){
				interval=500;
			}
		}
		try {
			rb=new Robot();
		} catch (AWTException e) {
			e.printStackTrace();
			System.exit(1);
		}
		l0=new Label();
		l0.setFont(new Font("Monospaced",Font.PLAIN,20));
		cv=new MyCanvas();
		f0.add(cv,BorderLayout.CENTER);
		f0.add(l0,BorderLayout.SOUTH);
		tmr=new Timer();
		tmr.schedule(new DoPick(), 1000, interval);

		f0.setSize(300,300);
		f0.setVisible(true);
	}
	class MyCanvas extends Canvas {
		private static final long serialVersionUID = 1L;
		@Override
		public void paint(Graphics g){
			if (buf!=null) {
				g.drawImage(buf, 0,0,270,270, 0,0,9,9, f0);
				g.setColor(Color.BLACK);
				g.drawRect(119,119,32,32);
				g.setColor(Color.WHITE);
				g.drawRect(118,118,34,34);
			}
		}
	}
	class DoPick extends TimerTask {
		public void run() {
			PointerInfo pi=MouseInfo.getPointerInfo();
			Point pp=pi.getLocation();
			Rectangle rct=new Rectangle(pp.x-4,pp.y-4,9,9);
//			System.out.printf("%d %d\n",pp.x,pp.y);
			buf=rb.createScreenCapture(rct);
			int p[]=buf.getRaster().getPixels(4, 4, 1, 1, (int [])null);
			l0.setText(String.format("Color=#%02X%02X%02X",p[0],p[1],p[2]));
			cv.repaint();
		}
	}

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

ひとつの例ですので、他の書き方もあるでしょう。

実行プログラムが欲しい、という方はメールフォームからご連絡ください。
こちらから→メールフォーム
ご意見、ご質問などもお気軽にどうぞ。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。