1

Java で画像にストローク (アウトライン) を適用したいと考えています。これこれを読んだ後、Java2D API がストロークをシェイプにのみ適用するように見えますか? 確かに、ビットマップの塗りつぶしを行ってから、その形状にストロークを適用できますが、指定されたビットマップに直接適用できるかどうかを知りたいです。

更新: 画像全体の輪郭を描くストローク ビットを適用することができました。私の画像には PNG 透明度があります。

 public static void main(String[] args) {
    try {
        // TODO code application logic here
        URL u = GraphicsDemo.class.getResource("Capture222.png");
        BufferedImage img = ImageIO.read(new File(u.getPath()));
        System.out.print("loaded");
        Graphics2D g = img.createGraphics();
        Rectangle2D tr = new Rectangle2D.Double(0, 0,
                img.getWidth(), img.getHeight());
        // Create the TexturePaint.
        TexturePaint tp = new TexturePaint(img, tr);
        g.setStroke(new BasicStroke(20));
        g.setPaint(Color.ORANGE);
        //   g.fill(tr);
        g.draw(tr);


        ImageIO.write(img, "PNG", new File("myeditedimage.png"));
        g.dispose();
    } catch (IOException ex) {
        Logger.getLogger(GraphicsDemo.class.getName()).log(Level.SEVERE, null, ex);
    }
 } 

更新 1: Java Graphics API を使用して、何をしようとしているのかわかりません。もう一度、境界ボックスの周りではなく、目に見えるピクセルの輪郭に基づいて画像の輪郭を描く必要があります。それが私が達成しようとしていることです: ここに画像の説明を入力

4

5 に答える 5

2

はい、Java2D API はストロークを形状にのみ適用します。次の 2 つのことを行うことができます。

ビットマップイメージの透明度情報から Shape を作成して、透明でない部分のみをストロークできるようにします。これは、ビットマップ情報をベクトルベースの情報に変換することを意味するため、どの言語でも困難です。

これを確認してください:画像/グラフィックをシェイプに

そしてこれ:ギザギザのパスを滑らかにする

しかし、基本的には、変換の問題を回避し、ビットマップのみの方法で解決しようとします。たとえば、特定のピクセル距離で透明なピクセルを見つけることができるピクセルを (「ストロークの色」で) 色付けします ( 「ストローク幅」)。

于 2012-08-22T15:01:26.180 に答える
0
  • まず、Graphics2Dを呼び出して、アウトラインをどのように描画するかを指定しますsetStroke()。このメソッドは、を実装するすべてのオブジェクトを受け入れますjava.awt.Stroke interface。2D APIには、java.awt.BasicStroke一般的なストロークオプションを実装するクラスが付属しています。
  • アウトライン自体をどのように描画するかsetPaint()を指示するために使用します。Graphics2D図形の内部のようなアウトラインは、色、グラデーション、テクスチャ、またはペイントインターフェイスを実装するその他のものを使用して描画できます。
  • draw()Graphics2Dの方法を使用して、形状の輪郭を描画します。Graphics2Dは、ステップ1のストロークを使用して、アウトラインがどのように見えるかを決定します。手順2のペイントは、実際にアウトラインをレンダリングするために使用されます。

Graphics2Dストロークを使用して、特定の形状の輪郭がどのように見えるかを把握します。図形を要求Graphics2Dするとdraw()、そのストロークに図形の輪郭がどのように見えるかを尋ねます。興味深いことに、Strokeはストロークされたアウトラインを別の形状として返します。

public abstract Shape createStrokedShape(Shape p)

このメソッドは、指定されたシェイプのストロークされたアウトラインを表すShapeを返します。これはStrokeの唯一の方法です。通常、あなたはそれを自分で呼ぶことはありません、あなたが形Graphics2Dを作るときにあなたに代わってそれを呼びますdraw()

draw()aを呼び出すGraphics2Dことは、次のコードと同等です。

public void longwindedDraw(Graphics2D g2, Shape s) 
{
    Stroke stroke = g2.getStroke();
    Shape strokedOutline = stroke.createStrokedShape(s);
    g2.fill(strokedOutline);
}
于 2012-08-21T07:27:07.380 に答える
0

これを試して :

final static BasicStroke dash_stroke =new BasicStroke(1.0f,
                        BasicStroke.CAP_BUTT,
                        BasicStroke.JOIN_MITER,
                        10.0f, dash1, 0.0f);

次に Stroke を設定します。

g2.getStroke()
于 2012-08-21T08:26:30.823 に答える
-1

このような?そうでない場合は、必要な結果を示す画像を添付してください。

ストローク画像

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class StrokedImage {

    public BufferedImage getStrokedImage(
            BufferedImage bi, Shape shape, int strokeWidth) {
        int w = bi.getWidth();
        int h = bi.getHeight();
        BufferedImage bib = new BufferedImage(w,h,bi.getType());
        Graphics2D g = bib.createGraphics();

        BasicStroke bs = new BasicStroke(strokeWidth);
        g.setStroke(bs);
        Rectangle rect = new Rectangle(0,0,w,h); 
        TexturePaint tp = new TexturePaint(bi, rect); 
        g.setPaint(tp);
        g.draw(shape);

        g.dispose();
        return bib;
    }

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://pscode.org/media/stromlo1.jpg");
        final BufferedImage bi = ImageIO.read(url);
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                StrokedImage si = new StrokedImage();

                int strokeWidth = 12;
                int pad = 50;
                Shape shape = new Rectangle(
                        pad,pad,
                        bi.getWidth()-(2*pad),bi.getHeight()-(2*pad)); 
                Image i = si.getStrokedImage(bi, shape, strokeWidth);

                JPanel p = new JPanel(new GridLayout(1,0,5,5));
                p.add(new JLabel(new ImageIcon(i)));
                p.add(new JLabel(new ImageIcon(bi)));
                JOptionPane.showMessageDialog(null, p);
            }
        });
    }
}

質問の投稿編集 - 更新

この回答をご覧ください。Shape画像を描画する前にのクリップを適用します。次に、クリップをクリアし、Shapeそれ自体を境界線として描画します。

于 2012-08-21T23:45:41.473 に答える
-1

ビットマップに描画する Graphics2D オブジェクトを取得するには、BufferedImage を使用する必要があります。

BufferedImage img = ImageIO.read(new File("myimage.png"));
Graphics2D g = img.createGraphics();

// Paint on it like you want here...


g.dispose();
ImageIO.write(img, "PNG", new File("myeditedimage.png"));
于 2012-08-21T07:21:06.623 に答える