Utworzenie obiektu klasy BufferedImage z łańcucha znaków

0

W jaki sposób, mając dany String text, Font f i Color c, utworzyć przezroczysty BufferedImage z podanym tekstem, zapisanym podaną czcionką w podanym kolorze?

Próbowałem wieloma różnymi sposobami, ale żaden nie chciał funkcjonować poprawnie.

0

A taki wypróbowałeś?

img = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
Graphics g = img.createGraphics();
g.setFont(new Font("Dialog",Font.ITALIC,20));
g.setColor(new Color(138,204,178));
g.drawString("A kuku",100,100);
0

Zapisałem utworzony obrazek w trzech formatach:

ImageIO.write(img,"png",new File("Dupa.png"));
ImageIO.write(img,"jpg",new File("Dupa.jpeg"));
ImageIO.write(img,"gif",new File("Dupa.gif"));

W każdym zapisał się (prawie) dobrze. A dokładnie, w formacie jpeg są trochę inne kolory. Przy tworzeniu obrazka możesz dodać kod

g.setColor(Color.WHITE);
g.fillRect(0,0,width,height);

Dostaniesz wtedy białe tło.

0
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;

public class Obrazek extends JFrame
{
    private BufferedImage img = null;
    private int width = 600;
    private int height = 400;
    private JButton rysuj = null;
    private JButton zapisz = null;
    //------------------------
    public static void main(String[] args)
    {
        new Obrazek();
    }
    //------------------------
    public Obrazek()
    {
        super("Obrazek");
        JToolBar tb = new JToolBar();
        rysuj = new JButton("Narysuj");
        rysuj.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                make();
            }
        });
        tb.add(rysuj);
        tb.addSeparator();
        zapisz = new JButton("Zapisz");
        zapisz.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                write();
            }       
        });
        tb.add(zapisz);     
        add(tb,BorderLayout.NORTH);
        add(new PanelObrazka(),BorderLayout.CENTER);        
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    //------------------------
    private void write()
    {
        try
        {
            ImageIO.write(img,"png",new File("Dupa.png"));
            ImageIO.write(img,"jpg",new File("Dupa.jpeg"));
            ImageIO.write(img,"gif",new File("Dupa.gif"));
        }
        catch(Exception e)
        {
            System.out.println(e);
        }   
    }
    //------------------------
    private void make()
    {
        try
        {
            img = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
            Graphics g = img.createGraphics();
            g.setFont(new Font("Dialog",Font.ITALIC,20));
            g.setColor(new Color(138,204,178));
            g.drawString("A kuku",100,100);
            repaint();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
    //------------------------
    class PanelObrazka extends JPanel
    {
        public PanelObrazka()
        {
            setPreferredSize(new Dimension(width,height));
            setBackground(Color.WHITE);
        }
        //--------------------
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawString("Cud",20,20);
            if(img != null)
            {
                 g.drawImage(img,0,0,null);         
            }
        }
    }
}

Przepraszam za nieczytelny kod, w którym klasa startowa dziedziczy po JFrame.

0

To może takie pytanie:
W Graphics.drawString podaje się koordynaty. Czy programiści z Sun/Oracle utrzymali swoją zasadę, że podaje się położenie lewego górnego rogu elementu, czy postanowili w tej jednej metodzie nagle to zmienić?

To było pytanie retoryczne.

http://docs.oracle.com/javase/6/docs/api/java/awt/Graphics.html

The baseline of the leftmost character is at position (x, y)

Baseline. http://pl.wikipedia.org/wiki/Linia_bazowa

Tekst po prostu rysował się nad krawędzią obrazka, bo jako parametry X i Y podawałem 0, święcie wierząc, że mam podać lewy górny róg.

1 użytkowników online, w tym zalogowanych: 0, gości: 1