Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нарисовать текст средствами Java2D, с определенными эффектами 
V
    Опции темы
Kangaroo
Дата 15.4.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 15
Всего: 104



Всем привет.

Мне нужно нарисовать на картинке текст с различными эффектами. Не могу сделать гравированный и рельефный текст (это как raised bevel & lowered bevel рамки).
Такое вообще можно сделать? Может кто-то делал?

Для примера - код рисует текст  и текст с тенью (не мой).
Код

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.AffineTransform;
import javax.swing.*;
 
public class SimpleEx extends JPanel {
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        String s = "Hello World";
        Font font = new Font("Ariel", Font.PLAIN, 38);
        g2.setFont(font);
        FontRenderContext frc = g2.getFontRenderContext();
        TextLayout textLayout = new TextLayout(s, font, frc);
        Color textColor = Color.orange;
        Color shadowColor = Color.green.darker();
 
        // Text can be plain text if effect is 0 in colorText.
        int x = 20;
        int y = 150;
        g2.setPaint(textColor);
        textLayout.draw(g2, x, y);

        AffineTransform at = AffineTransform.getTranslateInstance(x, y);
        Shape outline = textLayout.getOutline(at);
 
        // If effect is 2 then need a drop shadow in
        // shawdowColor + the normal text.
        x = 240;
        y = 170;
        at.setToTranslation(x+5.0, y+3.0);
        outline = textLayout.getOutline(at);
        g2.setPaint(shadowColor);
        g2.fill(outline);
        g2.setPaint(textColor);
        textLayout.draw(g2, x, y);
    }
 
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new SimpleEx());
        f.setSize(500,240);
        f.setLocation(200,200);
        f.setVisible(true);
    }
}



--------------------
Lost....
PM MAIL MSN   Вверх
dorogoyIV
Дата 15.4.2009, 23:08 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



самому рисовать надо:
Код

 protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        String s = "Raised";
        Font font = new Font("Ariel", Font.PLAIN, 38);
        g2.setFont(font);
        FontRenderContext frc = g2.getFontRenderContext();
        TextLayout textLayout = new TextLayout(s, font, frc);
        Color textColor = Color.ORANGE;
 
        int x = 20;
        int y = 150;
        g2.setPaint(textColor);
        textLayout.draw(g2, x, y);

        AffineTransform at = AffineTransform.getTranslateInstance(x, y);
        Shape outline = textLayout.getOutline(at);

        x = 240;
        y = 170;
        outline = textLayout.getOutline(at);

        g2.setPaint(textColor.darker());

        at.setToTranslation(x + 1.0, y + 1.0);
        outline = textLayout.getOutline(at);
        g2.fill(outline);

        at.setToTranslation(x + 2.0, y + 2.0);
        outline = textLayout.getOutline(at);
        g2.fill(outline);

        at.setToTranslation(x + 3.0, y + 3.0);
        outline = textLayout.getOutline(at);
        g2.fill(outline);

        g2.setPaint(textColor);
        textLayout.draw(g2, x, y);
    }

PM MAIL   Вверх
Kangaroo
Дата 17.4.2009, 11:17 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 15
Всего: 104



Цитата(dorogoyIV @  15.4.2009,  23:08 Найти цитируемый пост)
самому рисовать надо

Уже понял smile

За код спасибо, оч помог! Теперь мучаюсь как сделать гравированный текст, пока не закрываю тему.


--------------------
Lost....
PM MAIL MSN   Вверх
dorogoyIV
Дата 17.4.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



все туда же в метод paintComponent(...
Код

 GradientPaint gp = new GradientPaint(0, 0, Color.ORANGE,
                                                              0, g2.getFont().getSize() / 2,
                                                              Color.RED, true);
 g2.setPaint(gp);


есть еще TexturePaint(java.awt.image.BufferedImage txtr, java.awt.geom.Rectangle2D anchor)
там можно самому порисовать текстуры
Код

 BufferedImage bi = new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB);
 Graphics2D gr = bi.createGraphics();
 gr.draw(new Line2D.Double(0.0, 0.0, 10.0, 10.0));
 gr.draw(new Line2D.Double(0.0, 10.0, 10.0, 0.0));
 TexturePaint tp = new TexturePaint(bi, new Rectangle(10, 10, 4, 4));
 g2.setPaint(tp);


Это сообщение отредактировал(а) dorogoyIV - 17.4.2009, 17:10
PM MAIL   Вверх
Kangaroo
Дата 17.4.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 15
Всего: 104



dorogoyIV,
гравированный = вырезанный. В первом примере ты сделал выпуклый, а второй эффект - вырезанный. Вроде похожий, но я никак не могу правильно подобрать тень и куда ее вставить.


--------------------
Lost....
PM MAIL MSN   Вверх
dorogoyIV
Дата 18.4.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



а, понял, что бы получился вырезанный, надо тень сделать внутри, и что бы ничего наружу не вылазило
PM MAIL   Вверх
Kangaroo
Дата 18.4.2009, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 15
Всего: 104



Цитата(dorogoyIV @  18.4.2009,  00:17 Найти цитируемый пост)
надо тень сделать внутри, и что бы ничего наружу не вылазило 

Угу, пока коряво получается smile Выложу результат позже.


--------------------
Lost....
PM MAIL MSN   Вверх
dorogoyIV
Дата 22.4.2009, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



как то так, но тоже немного коряво  smile 
Код

import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.font.*;
import java.awt.event.*;
import javax.swing.*;

public class TestText extends JFrame
{
 public TestText()
 {
  setLayout(new FlowLayout());
  add(new ShadingText("Kangaroo",
                       new Font("Serif", Font.BOLD, 64)));
  add(new ShadingText("Kangaroo",
                       new Font("Arial", Font.BOLD + Font.ITALIC, 64)));
 }

 public static void main(String [] args)
 {
  JFrame f = new TestText();
  f.setBounds(60, 100, 500, 300);
  f.setDefaultCloseOperation(3);
  f.setVisible(true);
 }
}

class ShadingText extends JPanel
{
 String text;
 Font font;
 FontMetrics fm;

 ShadingText(String text, Font font)
 {
  this.text = text;
  this.font = font;

  fm = getFontMetrics(font);
  Graphics2D g2 = (Graphics2D)getGraphics();
  Rectangle r = getRect(fm, g2);
  setPreferredSize(new Dimension(r.width, r.height + fm.getDescent() + 2));
 }

 public Rectangle getRect(FontMetrics fm, Graphics2D g2)
 {
  Rectangle2D r2 = fm.getStringBounds(text, g2);
  Rectangle r = new Rectangle((int)r2.getX(), (int)r2.getY(),
                              (int)r2.getWidth(), (int)r2.getHeight());
  return r;
 }

 public void paintComponent(Graphics g)
 {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D)g;
  g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                      RenderingHints.VALUE_ANTIALIAS_ON);
  g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                      RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

  g2.setFont(font);
  g2.setColor(Color.GRAY);

  FontRenderContext frc = g2.getFontRenderContext();
  TextLayout textLayout = new TextLayout(text, font, frc);

  Rectangle r = getRect(fm, g2);

  textLayout.draw(g2, 0, r.height);

  BufferedImage bi = new BufferedImage(r.width, r.height,
                                       BufferedImage.TYPE_INT_ARGB);
  Graphics2D gr = bi.createGraphics();
  gr.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                      RenderingHints.VALUE_ANTIALIAS_ON);
  gr.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                      RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

  gr.setFont(font);
  gr.setColor(g2.getColor().brighter());
  gr.drawString(text, -1, r.height - fm.getDescent() + 1);

  TexturePaint tp = new TexturePaint(bi, r);
  g2.setPaint(tp);

  textLayout.draw(g2, 0, r.height);
 }
}

PM MAIL   Вверх
Kangaroo
Дата 29.4.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 15
Всего: 104



Цитата(dorogoyIV @  22.4.2009,  11:04 Найти цитируемый пост)
тоже немного коряво

Да, корявенько smile 
Я сделал похоже на твой первый вариант - темная тень слева и светлая поменьше тень справа. Получилось тоже не Айс.

А заказчик вообще провтыкал, у него эта функциональность уже была реализована на стороне сервера  smile Так что корявость уже не важна.

Спасибо за помощь. Тему закрываю.


--------------------
Lost....
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.