14

この図のようなAWTのテキストの周りにアウトラインを描くにはどうすればよいですか?

概要

4

5 に答える 5

9

2つの例

このペイントからの出力はBufferedImage、AWTコンポーネントの場合はメソッドを使用しpaint()、SwingJComponentsの場合はそこにありますpaintComponet()

また、コメントにリンクされているコードから:

于 2012-04-04T18:21:16.663 に答える
8

次のことを試してください。

public void paintTextWithOutline(Graphics g) {
    String text = "some text";

    Color outlineColor = Color.white;
    Color fillColor = Color.black;
    BasicStroke outlineStroke = new BasicStroke(2.0f);

    if (g instanceof Graphics2D) {
        Graphics2D g2 = (Graphics2D) g;

        // remember original settings
        Color originalColor = g2.getColor();
        Stroke originalStroke = g2.getStroke();
        RenderingHints originalHints = g2.getRenderingHints();


        // create a glyph vector from your text
        GlyphVector glyphVector = getFont().createGlyphVector(g2.getFontRenderContext(), text);
        // get the shape object
        Shape textShape = glyphVector.getOutline();

        // activate anti aliasing for text rendering (if you want it to look nice)
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);

        g2.setColor(outlineColor);
        g2.setStroke(outlineStroke);
        g2.draw(textShape); // draw outline

        g2.setColor(fillColor);
        g2.fill(textShape); // fill the shape

        // reset to original settings after painting
        g2.setColor(originalColor);
        g2.setStroke(originalStroke);
        g2.setRenderingHints(originalHints);
    }
}
于 2016-02-05T10:42:11.320 に答える
2

現在、テキストをどのように描画しているかはわかりませんが、1つの方法として、描画しているもののオーバーレイとしてBufferedImageを使用することができます。

  1. 描画する文字列とフォントのサイズを使用してBufferedImageを作成します(これについてはFontMetricsクラスを参照してください)。
  2. BufferedImageを透明度で塗りつぶします。
  3. 好きな色で文字列をBufferedImageに描画します。
  4. BufferedImageのすべてのピクセルを繰り返し処理し、テキストの色のピクセルからどれだけ離れているかを確認します。一定の距離内にある場合は、そのピクセルを黒で描画し、テキストの色から離れている場合は、より透明に描画します。もちろん、ピクセルがすでにテキストの色と同じ色である場合は、無視してください。
  5. ペイントしているものにBufferedImageを描画します。

編集

すでにこれを行っているライブラリがあるかもしれませんが、最初からコーディングする必要がある場合は、これを実行しようとします。

于 2012-04-04T18:11:31.667 に答える
1

これはハッキーな例です。他の製品ほど洗練されていませんが、理解しやすく、JLabelのように動作します。

public class OutlineLabel extends JLabel {

    private Color outlineColor = Color.WHITE;
    private boolean isPaintingOutline = false;
    private boolean forceTransparent = false;

    public OutlineLabel() {
        super();
    }

    public OutlineLabel(String text) {
        super(text);
    }

    public OutlineLabel(String text, int horizontalAlignment) {
        super(text, horizontalAlignment);
    }

    public Color getOutlineColor() {
        return outlineColor;
    }

    public void setOutlineColor(Color outlineColor) {
        this.outlineColor = outlineColor;
        this.invalidate();
    }

    @Override
    public Color getForeground() {
        if ( isPaintingOutline ) {
            return outlineColor;
        } else {
            return super.getForeground();
        }
    }

    @Override
    public boolean isOpaque() {
        if ( forceTransparent ) {
            return false;
        } else {
            return super.isOpaque();
        }
    }

    @Override
    public void paint(Graphics g) {

        String text = getText();
        if ( text == null || text.length() == 0 ) {
            super.paint(g);
            return;
        }

        // 1 2 3
        // 8 9 4
        // 7 6 5

        if ( isOpaque() )
            super.paint(g);

        forceTransparent = true;
        isPaintingOutline = true;
        g.translate(-1, -1); super.paint(g); // 1 
        g.translate( 1,  0); super.paint(g); // 2 
        g.translate( 1,  0); super.paint(g); // 3 
        g.translate( 0,  1); super.paint(g); // 4
        g.translate( 0,  1); super.paint(g); // 5
        g.translate(-1,  0); super.paint(g); // 6
        g.translate(-1,  0); super.paint(g); // 7
        g.translate( 0, -1); super.paint(g); // 8
        g.translate( 1,  0); // 9
        isPaintingOutline = false;

        super.paint(g);
        forceTransparent = false;

    }

    public static void main(String[] args) {
        JFrame w = new JFrame();
        w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        OutlineLabel label = new OutlineLabel("Test", OutlineLabel.CENTER);
        label.setOpaque(true);
        w.setContentPane(new JPanel(new BorderLayout()));
        w.add(label, BorderLayout.CENTER);
        w.pack();
        w.setVisible(true);
    }
}
于 2014-05-07T14:52:20.903 に答える
0

いくつかの最も愚かな回避策:-同じ単語を2回入力しますが、一方は黒でもう一方は白です。黒の上に白を置くと、似たようなものになる可能性があります。-上記の例のようなフォントを見つけて使用します。

于 2012-04-04T17:15:04.640 に答える