画面の部分拡大鏡(虫めがね)を作ってみよう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);
}
}
ひとつの例ですので、他の書き方もあるでしょう。
実行プログラムが欲しい、という方はメールフォームからご連絡ください。
こちらから→メールフォーム
ご意見、ご質問などもお気軽にどうぞ。
この記事へのコメントはこちら