画面の部分拡大鏡(虫めがね)を作ってみよう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値を表示する機能を追加してみてください。
この記事へのコメントはこちら