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

Utworzenie obiektu klasy BufferedImage z łańcucha znaków
ShookTea
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
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.


bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

A taki wypróbowałeś?

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

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
ShookTea
Zapisuję wygenerowany obrazek do pliku .JPG, dostaję czarny kwadrat. Zapisuję do .GIF, dostaję... przezroczysty kwadrat. Tekstu nie widać.
bogdans
O zapisywaniu obrazka do pliku niczego nie pisałeś, wyświetla się poprawnie.
KP
Może źle zapisujesz? Sprawdź, bo jak na mój gust to zapisują ci się zerowe wartości.
ShookTea
Wyświetlać też się nie da.
bogdans
Tzn. nie potrafisz ani tworzyć obrazków, ani zapisywać.
ShookTea
Nie, nie potrafię. Gdybym to umiał, nie pytałbym się. Do tej pory operowałem tylko na już gotowych obrazach, nie musiałem ich edytować.
bogdans
Wystarczyło po prostu przepisać kod. Tego też nie umiałeś?
ShookTea
Po podaniu moich wartości w drawString() nie działało. Wyjaśnienie w ostatnim poście.
bogdans
Dostałeś działający kod i skomentowałeś go Wyświetlać też się nie da. Chyba nie wymagasz, żeby Cię ostrzegał przed wszystkimi możliwymi głupimi modyfikacjami.
ShookTea
Nie mam zamiaru się kłócić, więc powiem jedynie, że "zawsze, gdy coś mi nie działa, to jest to moja wina" - zapamiętać i bez żadnych komentarzy przyjmować moje słowa "nie działa" jako "nie działa, coś popsułem".
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Zapisałem utworzony obrazek w trzech formatach:

Kopiuj
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

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

Dostaniesz wtedy białe tło.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0
Kopiuj
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 smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
ShookTea
Ironia zaiste cudowna, ale dowiedziałeś się przecież, że chodziło o ten jeden konkretny przypadek.
ShookTea
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
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.


edytowany 1x, ostatnio: ShookTea

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.