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.
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.
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.
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.
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.
drawString()
nie działało. Wyjaśnienie w ostatnim poście.Wyświetlać też się nie da
. Chyba nie wymagasz, żeby Cię ostrzegał przed wszystkimi możliwymi głupimi modyfikacjami.