Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

画像を円形に抜き出すには?

マウスを移動させると画像の一部分が表示されるプログラムを作りたいと思っています。

矩形ではdrawimageでどうにかできそうかな?なのですが、
円形ではどうしたらいいのでしょうか。

動作のイメージとしては、画像処理ソフトの消しゴムツールの正反対のことで、ごしごしすると背景が出てくるようにしたいです。

どうぞよろしくお願いします。

6

回答

3476

閲覧

6件の回答

評価

0

一部を抜き出すことをclipと言います。
clipを設定することで、DrawImageの範囲を制御できます。

評価

0

mioさん。ありがとうございます。

g.setClip(new Ellipse2D.Double(p.x-100,p.y-100,200,200));

このようにして円形に抜き出すことができました。

ついでなのですが、
swing で 背景を消さずに更新することができません。
public void update(Graphics g) {paint(g);} これでは
うまくいかず、スポットライトのようになってしまいます。どのようにすれば連続した描画にできるのでしょうか。

評価

0

先に背景を描画してから、円を描画しては。

評価

0

>swing で 背景を消さずに更新することができません。
拡張性は低くなりますが、一番簡単なのは、JComponent#paintComponent(Graphics)をオーバーライドして、super.paintComponent()呼出し後に、該当処理を実装します。

あと、クリッピングパスをsetする場合、元に戻すことを忘れずに。

評価

0

mioさん、fooさん、早速の回答ありがとうございます。

しかし、根本的に理解不足なのかお手上げです。

ソースの主なところを抜粋してますが、
下のようにしてます。
読みづらいとは思いますがご指導よろしくお願いします。
クリッピングパスを元に戻すというのも分かりません。

public class      extends JApplet implements MouseMotionListener{
    
public void init(){    
    try {img = getImage(newURL("http://www.jpg"));
} catch (MalformedURLException e) {
    e.printStackTrace();
    }
    _img = new Img();
    addMouseMotionListener(this);    
    cont = getContentPane();
    cont.add(_img,BorderLayout.CENTER);
            
    }
    
    class Img extends JPanel{    
    
public void paintComponent(Graphics g){    
    super.paintComponent(g);    
    setBackground(Color.black);
    g.setClip(new Ellipse2D.Double(p.x-100,p.y-100,200,200));
    g.drawImage(img , 0 , 0 , this);
    g.setClip(null);
        
    }
    
}
public void mouseDragged(MouseEvent e) {
    
    }

    public void mouseMoved(MouseEvent e) {        
        p.setLocation(e.getX() , e.getY());
            repaint();
        }        
    }
}

評価

0

ざっと見ました。

まず、他人にコードを提示する場合の注意点から。

1.他人にコードを提示する場合、抜粋だとしても、可能な限り、「実行可能」な「ミニマム」コードを提示すること。
コンパイルを実行してませんが、このコードはコンパイルエラーが発生するでしょう。つまり、実行すらできないでしょう。
これは、回答者に負担を転嫁するだけです。

2.AppletやJAppletを使用するコードを提示する場合、このコードの読み手にhtmlファイルの用意や、appletviewerの使用を暗黙的に強制します。
つまり、これを試しに実行してみようとする人の数が、
狭まります。よって、回答がつきにくくなります。

次にコード記述上の注意点です。
1.使い捨て用のためかもしれませんが、クラス名、変数名はきちんと考えましょう。

2.実行上、問題はありませんが、コードの可読性を損なう可能性があるため、Color.blackのような小文字定数を使用することは避けましょう。
小文字定数は命名規約が一般化するまえの負の遺産です。

3.RootPaneContainer実装コンポーネントは、必要でない限り、RootPaneContainerを継承することは避け、JComponentやJPanel等を継承しましょう。

4.このコードから必要かどうか判別できませんが、
superクラスのメソッドのアクセス修飾子は、必要がなければ、サブクラスで緩くしないこと。protectedにはprotectedの意味があります。

クリッピングパスを元に戻すとは、以下のようなことです。

Shape oldClip = g.getClip();
//任意の描画処理
g.setClip(oldClip);
つまり、自分でクリップを設定した後は、責任を持って元に戻すことという意味です。

>しかし、根本的に理解不足なのかお手上げです。
GUIコンポーネントを自分で拡張する場合、基本的な描画処理、JAVA2D描画処理、コンポーネントの描画処理の基本的な知識と経験が必要になります。
これらを勉強してみてください。
「急がば回れ」です。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。