クラス scratch:Applet継承、マウスモーションリスナー実装
init():画像ファイル読み込み、配列生成、イメージ生成、マウスモーションリスナー追加
paint():イメージの描画
update():paint()の実行
mouseMoved():何もせず
mouseDragged():現在位置の取得、削る操作、画像の再描画
get_pixels():画像のデータを配列に格納(init()から実行)
cover():表示イメージの初期化(init()から実行)
scratch():配列を変更してイメージを再構成(mouseDragged()から実行)
//画像処理によるスクラッチ import java.applet.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; /* <applet code="scratch" width="100" height="100"> <param name="files" value="1"> </applet> */ public class scratch extends Applet implements MouseMotionListener{ Image paper; int[] src_pix,paper_pix; int imgWDH,imgHGT; // public void init(){ //乱数で使用するファイル名をさだめる int n = Integer.parseInt(getParameter("files")); n = 1 + (int)(Math.random() * n); Image img = getImage(getCodeBase(),"image" + n + ".gif");//画像を読む src_pix = get_pixels(img);//画像の画素を取得 paper = cover();//表示画像の初期化 resize(imgWDH,imgHGT);//画像にあわせてサイズ変更 addMouseMotionListener(this); }//init public void update(Graphics g){ //clearRect(やるとちらつく) paint(g); }//update public void paint(Graphics g){ g.drawImage(paper,0,0,this); }//paint public void mouseMoved(MouseEvent me){ //do nothing }//moved public void mouseDragged(MouseEvent me){ //マウスの位置を取得 Point pt = me.??Point(); if(pt.x >= 0 && pt.x < imgWDH && pt.y >= 0 && pt.y < img???){ int address = (int)pt.getX() + imgWDH * (int)pt.getY();//画素配列は一次元なので変換 // System.out.println("address : " + address); paper = sc???(address);//マウス位置周辺を削る repaint();//再描画 }//if }//dragged public int[] get_pixels(Image src){ //画像の画素配列と、高さ・幅情報の取得 MediaTracker mt = new MediaTracker(this); mt.addImage(src,0); try{ mt.waitForID(0); }//try catch(InterruptedException e){ System.out.println("cannnot read."); }//catch imgWDH = src.getWidth(this);//MediaTrackerを介さないと読めない imgHGT = src.getHeight(this); int pix[] = new int[imgWDH * imgHGT]; //画像を画素に展開 try{ PixelGrabber pg = new PixelGrabber(src,0,0,imgWDH,imgHGT,pix,0,imgWDH); pg.grabPixels(); }//try catch(InterruptedException e){ }//catch return pix; }//getPixels public Image cover(){ //削られていない状態の画素配列の生成 paper_pix = new int[imgWDH * imgHGT]; for(int i = 0; i < paper_pix.length;i++){ paper_pix[i] = 0xffcccccc;//初期の色 }//for MemoryImageSource img_m = new MemoryImageSource(imgWDH,imgHGT,paper_pix,0,imgWDH); Image new_img = createImage(img_m); return new_img; }//covered public Image scratch(int ad){ //マウスの位置を中心に周囲の12ピクセルの色を原画像の色に置き換える //上下は配列範囲のチェック //左右は回り込みのチェック paper_pix[ad] = src_pix[ad];//中心 if(ad >= imgWDH) paper_pix[ad - imgWDH] = src_pix[ad - imgWDH];//上1 if(ad >= imgWDH ??) paper_pix[ad - (imgWDH * 2)] = src_pix[ad - (imgWDH * 2)];//上2 if(ad % imgWDH != 0) paper_pix[ad - 1] = src_pix[ad - 1];//左1 if(ad % imgWDH != 1) paper_pix[ad - ??] = src_pix[ad - ??];//左2 if(ad + imgWDH < paper_pix.length) paper_pix[ad + imgWDH] = src_pix[ad + imgWDH];//下1 if(ad + (imgWDH * 2) < paper_pix.length) paper_pix[ad + (imgWDH * 2)] = src_pix[ad + (imgWDH * 2)];//下2 if(ad % imgWDH != imgWDH - 1) paper_pix[ad + 1] = src_pix[ad + 1];//右1 if(ad % imgWDH != imgWDH - 2) paper_pix[ad + 2] = src_pix[ad + 2];//右2 if(ad >= imgWDH && ad % imgWDH != 0) paper_pix[ad - imgWDH - 1] = src_pix[ad - imgWDH - 1];//左下 if(ad >= imgWDH && ad % imgWDH != imgWDH - 1) paper_pix[ad - imgWDH + 1] = src_pix[ad - imgWDH + 1];//右下 if(ad + imgWDH < paper_pix.length && ad % imgWDH != 0) paper_pix[ad + imgWDH - 1] = src_pix[ad + imgWDH - 1];//左上 if(ad + imgWDH < paper_pix.length && ad % imgWDH != imgWDH - 1) paper_pix[ad + imgWDH + 1] = src_pix[ad + imgWDH + 1];//右上 //変更された配列をもとにImageを再度生成 MemoryImageSource img_m = new MemoryImageSource(imgWDH,imgHGT,paper_pix,0,imgWDH); Image new_img = createImage(img_m); return new_img; }//scratched }//scratch