Почему этот удар настолько фрагментирован и почему он касается только внутренней части?

1

Я рисую некоторый текст над изображением, используя 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
    Рассматривали ли вы перевод outline ? outline будет нарисован в том же месте, что и текст? Кроме того, вы никогда не сбрасываете обводку, поэтому текст, вероятно, был нарисован с тем же обводкой ....
  • 0
    Ах, хороший улов о не сбрасываемом бите удара. Сначала я его переустанавливал, но хотел посмотреть, будут ли эти два идеально совпадать, если я использую один и тот же ход. Очевидно нет. Но да, результат точно такой же, когда я сбросил ход. Я не понимал, что было необходимо перевести план? Разве удар не должен расширять его с обеих сторон?
Показать ещё 2 комментария
Теги:
awt
java-2d

1 ответ

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();

Я бы тоже избавился от клипа...

Вместо того, чтобы "погладить" результирующую форму, у меня возникло бы желание "заполнить" цвет фона и "нарисовать" контурный цвет на нем, например...

Изображение 174551

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

Изображение 174551

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();
  • 0
    Это сработало очень хорошо. Оглядываясь назад, я понятия не имею, почему я пытался погладить внешность персонажей. Я полагаю, что некоторая идеология проистекает из графических редакторов, омрачающих мое мнение :) Большое спасибо.
  • 0
    "Использовать JOIN_ROUND вместо JOIN_ROUND"?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню