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

 

Javaに限らず、プログラミング言語というものには、とてもたくさんのクラス(ライブラリ)があります。
プログラミングできる人は、それらを全部覚えているのか?というと
決してそんな事はありません。

毎度、管理人イガジーです。

数が多すぎて、しかも細かい事もあるので、とてもじゃないですが
覚えきれません。ですから、必要に応じて調べながら作るのです。
確か、こんなのあったよなぁ、で検索。
たぶん、こういう事をしてくれるクラスがあるハズ、で検索。
過去に作ったソースコードをひっぱりだして、コピペ&改造。
みんなそうやってるのです。
ですから「覚えられない」「私には無理」などと悩まないでくださいね。

さて、画面部分拡大(虫めがね)のプログラム例です。

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
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 MagGla {
	Frame f0;
	MyCanvas cv;
	BufferedImage buf=null;
	Robot rb=null;
	Timer tmr;
	int interval=500;

	MagGla(){
		f0=new Frame();
		f0.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
        });
		try {
			rb=new Robot();
		} catch (AWTException e) {
			e.printStackTrace();
			System.exit(1);
		}
		cv=new MyCanvas();
		f0.add(cv,BorderLayout.CENTER);
		tmr=new Timer();
		tmr.schedule(new DoPick(), 1000, interval);

		f0.setSize(280,280);
		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, null);
				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();
			buf=rb.createScreenCapture(new Rectangle(pp.x-4,pp.y-4,9,9));
			cv.repaint();
		}
	}

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

タイマータスクの使い方などは、すぐに忘れるので
過去のプログラムからコピペしてきます。

キャプチャーする範囲は、奇数ドットにして中心が真ん中になるようにします
(上記の例では、9ドット×9ドットの範囲をキャプチャーしています)。
拡大表示は、g.drawImage(buf, 0,0,270,270, 0,0,9,9, null);で、(0,0)-(8,8)の範囲を(0,0)-(269,269)に描画しています。
辺の長さでいうと9ドットが270ドットになるので30倍です。

中心が分かるように、paint()の中で

g.setColor(Color.BLACK);
g.drawRect(119,119,32,32);
g.setColor(Color.WHITE);
g.drawRect(118,118,34,34);

で、黒枠と白枠を描いています。

キャプチャーしたデータ(buf)から1ドットを取り出すには
int p[]=buf.getRaster().getPixels(4, 4, 1, 1, (int [])null);などとします。
この例では、bufの(4,4)から1ドットを取り出して、p[0],p[1],p[2]に格納しています。
p[0]がR(Red), p[1]がG(Green), p[2]がB(Blue)の輝度です(0〜255)。

上記を利用して、RGB値を表示する機能を追加してみてください。

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

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

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