Usar Graphics2D para superponer texto en una Imagen Buffered y devolver una Imagen Buffered

Resuelto Bolster asked hace 14 años • 1 respuestas

He comprobado preguntas con nombres similares, pero no responden a este caso de uso.

Básicamente, debía superponer algo de texto (texto) en una coordenada determinada (x,y). Tengo la siguiente función en un paquete;

protected BufferedImage Process2(BufferedImage image){
    Graphics2D gO = image.createGraphics();
    gO.setColor(Color.red);
    gO.setFont(new Font( "SansSerif", Font.BOLD, 12 ));
    gO.drawString(this.text, this.x, this.y);
    System.err.println(this.text+this.x+this.y);
    return image;
}

Siento que me estoy perdiendo algo evidentemente obvio; Todas las referencias a Graphics2D que puedo encontrar tratan sobre juegos o escriben directamente en un archivo, pero solo quiero que me devuelvan una Imagen Buffered. con la superposición 'renderizada'

En el código actual, la imagen aparece al final sin cambios.

¡Gracias!

Bolster avatar Apr 17 '10 20:04 Bolster
Aceptado

El método drawString()utiliza xey para la línea base del carácter más a la izquierda . Los números normalmente no tienen descendentes; Si ocurre lo mismo con , una cadena dibujada en la posición (0,0) se representará completamente fuera de la imagen. Vea este ejemplo .text

Anexo: Es posible que tenga problemas con un modelo de color incompatible en su imagen. Un recurso sencillo es renderizar la imagen y luego modificarla in situ .

Hola

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * @see https://stackoverflow.com/questions/2658663
 */
public class TextOverlay extends JPanel {

    private BufferedImage image;

    public TextOverlay() {
        try {
            image = ImageIO.read(new URL(
                "http://cdn.sstatic.net/stackexchange/img/logos/so/so-logo.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        image = process(image);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(image.getWidth(), image.getHeight());
    }

    private BufferedImage process(BufferedImage old) {
        int w = old.getWidth() / 3;
        int h = old.getHeight() / 3;
        BufferedImage img = new BufferedImage(
            w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = img.createGraphics();
        g2d.drawImage(old, 0, 0, w, h, this);
        g2d.setPaint(Color.red);
        g2d.setFont(new Font("Serif", Font.BOLD, 20));
        String s = "Hello, world!";
        FontMetrics fm = g2d.getFontMetrics();
        int x = img.getWidth() - fm.stringWidth(s) - 5;
        int y = fm.getHeight();
        g2d.drawString(s, x, y);
        g2d.dispose();
        return img;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new TextOverlay());
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }
}
trashgod avatar Apr 17 '2010 14:04 trashgod