为什么这个中风如此碎片,为什么它只会冲击内部?

时间:2015-03-26 00:41:35

标签: java awt java-2d

我正在使用LineBreakMeasurer和TextLayout在图像上绘制一些文本,但由于某种原因,笔划只是在内部抚摸,并且它不是很干净。 这是我正在谈论的一个例子: http://i.imgur.com/eHtTw4p.png

当我不把字母画在上面并增加笔画宽度时,它实际上会变得更厚而不是在外面。

这是我的代码:

        float y = 0.0f;
        float wrappingWidth = img.getWidth() * 0.8f;
        LineBreakMeasurer measurer = new LineBreakMeasurer(str.getIterator(), imageGraphics.getFontRenderContext());
        while (measurer.getPosition() < sentence.length()) {
            TextLayout layout = measurer.nextLayout(wrappingWidth);
            y += layout.getAscent();
            float x =  ((wrappingWidth * 0.8f) - layout.getVisibleAdvance()) / 2f + (wrappingWidth * 0.2f);

            AffineTransform transform = new AffineTransform();
            transform.translate((double)x, (double)y);
            Shape outline = layout.getOutline(transform);

            imageGraphics.setColor(Color.black);
            imageGraphics.setClip(outline);
            imageGraphics.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER));
            imageGraphics.draw(outline);
            imageGraphics.setColor(Color.white);
            imageGraphics.setStroke(new BasicStroke());

            layout.draw(imageGraphics, x, y);
            y += layout.getDescent() + layout.getLeading();
        }

我不确定我做错了什么。有谁知道吗?

1 个答案:

答案 0 :(得分:2)

在绘制大纲之前创建Graphics上下文的另一个副本...

Graphics2D sg = (Graphics2D)imageGraphics.create();
sg.setColor(Color.black);
sg.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER));
sg.draw(outline);
sg.dispose();

我也摆脱了这个片段......

而不是“抚摸”生成的形状,我会试图“填充”背景颜色并在其上“绘制”轮廓颜色,例如......

Outline

Graphics2D sg = (Graphics2D) g2d.create();
AffineTransform transform = new AffineTransform();
transform.translate((double) drawPosX, (double) drawPosY);
Shape outline = layout.getOutline(transform);

sg.setColor(Color.WHITE);
sg.fill(outline);
sg.setColor(Color.BLACK);
sg.draw(outline);
sg.dispose();

但如果你想要一个“漂亮”的粗中风,请使用BasicStroke.JOIN_ROUND代替BasicStroke.JOIN_MITER

Stroked

Graphics2D sg = (Graphics2D) g2d.create();
AffineTransform transform = new AffineTransform();
transform.translate((double) drawPosX, (double) drawPosY);
Shape outline = layout.getOutline(transform);

sg.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
sg.setColor(Color.BLACK);
sg.draw(outline);
sg.dispose();