Pinte BufferedImage en JFrame y escriba en el archivo

Estoy tratando de codificar un programa, que lee una imagen en una imagen almacenada, la pinta en el JFrame, pinta círculos en ella y la escribe en un archivo.

El siguiente código lo hará todo excepto el contenido del archivo guardado. La imagen guardada solo contiene la imagen Buffered sin tocar. Sin Círculos;) Ya traté de resolverlo cambiando y agregando algo de código, pero no ayudó mucho.

public class PaintImage extends Component {

BufferedImage img;
private int pngWidth, pngHeight;

public int getPngWidth() {
    return pngWidth;
}

public int getPngHeight() {
    return pngHeight;
}

public void paint(Graphics g) {
    super.paint(g);

 //g = img.createGraphics();
 g.drawImage(img, 0, 0, 809, 1080, null);
 g.drawOval(33, 33, 444, 444);
}

public PaintImage() {
try {
    img = ImageIO.read(new File("C:\\karte_vorlage.png"));
    pngWidth = img.getWidth();
    pngHeight = img.getHeight();

} catch (IOException e) {
}
}

public void writeImage () {
    try {
     img.getGraphics();
        ImageIO.write(img, "png", new File("C:\\save.png"));
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}


}

Sin comentar g = img.createGraphics (); causa una imagen desordenada.

Por favor, ayúdame. Gracias a todos de antemano.

editar: 1. El método paint (Gráficos g) se llama dos veces. En caso de minimización, se volverá a llamar dos veces.

Respuesta 1

Simplemente puede pintar el componente directamente en el BufferedImage

BufferedImage tempImage = new BufferedImage(imagePane.getWidth(), imagePane.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = tempImage.createGraphics();

imagePane.printAll(g);

ImageIO.write(tempImage, "png", new File("C:\\save.png"));

Sin embargo, es posible que desee jugar con el ancho y la altura para cumplir mejor con sus requisitos

ACTUALIZADO

Sigue pensando en esto.

Otra idea sería crear algún tipo de interfaz de "administrador de pintura" o "para pintar", que dado un Graphicscontenido podría pintarse por sí mismo (obviamente, le gustaría saber más información, como width& height)

Esto significaría que no importaría dónde fue pintado.

La otra cosa es que le gustaría proporcionar pistas al renderizador sobre cómo paintablele gustaría pintar (algo así como el tamaño preferido)

Solo una idea

Respuesta: 2

Dibuja el círculo a la imagen en otro método. Puede llamar a este otro método cuando lo desee. Luego, en el método de pintura, simplemente dibuja la imagen en el componente y nada más.

public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(img, 0, 0, 809, 1080, null);
}

public void drawCircle() {
    Graphics g = img.getGraphics();
    g.drawOval(33, 33, 444, 444);
}

También puede eliminar img.getGraphics (); desde el método writeImage, ya que no es necesario allí.

Respuesta: 3

Tengo una clase que tiene una referencia estática al ApplicationContext de Spring. Necesito borrar ese contexto y ejecutar el método de destrucción de sus beans únicos cuando la clase está a punto de descargarse. Asi es ...

Así que esta es la primera vez que publico aquí, así que espero que puedan ayudarme, de todos modos aquí está mi código: System.out.println ("¿Desea ejecutar? (Ingrese y para ejecutar):"); Scanner scan = ...

Creé una aplicación Spring Boot 2.1.3 con i18n habilitado, agregué devtools e instalé la extensión Firefox LiveReload. Desafortunadamente, cuando cambio mis plantillas Thymeleaf o los mensajes i18n, ...

He creado una aplicación Swing en mi máquina Windows de 7-64 bits y ahora estoy tratando de que funcione correctamente en una caja de Linux con Redhat CentOS. El código está debajo: import javax.swing.JButton; ...