Gracias de antemano por la ayudaJava BufferedImage ahorra con el color de fondo no deseado
Descripción: El programa dibuja, muestra y guarda una imagen. Funciona de la siguiente manera: el objeto mismo se extiende Marco. En el constructor, el objeto crea una Imagen Buffered y llama a un método que dibuja en esa imagen. Luego, muestra la imagen en el Marco. Finalmente, guarda la imagen en un archivo (no me importa qué formato usa). El programa principal crea el objeto, que hace el resto.
Problema: ¡El archivo guardado siempre tiene un fondo de color! Esto es especialmente extraño ya que la imagen mostrada está bien. Si utilizo el formato "jpg" con ImageIO.write(), el fondo es rojizo. Si utilizo el formato "png", el fondo es gris oscuro.
¡He pasado un tiempo en esto, y aún no tengo idea de qué demonios está pasando!
import java.awt.Frame ;
import java.awt.image.BufferedImage ;
import java.io.IOException ;
import java.awt.event.WindowEvent ;
import java.awt.event.WindowAdapter ;
import java.awt.Toolkit ;
import java.awt.Graphics2D ;
import java.awt.Graphics ;
import java.awt.Color ;
import java.awt.Dimension ;
import javax.imageio.ImageIO ;
import java.io.File ;
import java.awt.geom.Rectangle2D;
public class HGrapher extends Frame{
private BufferedImage img ;
private float colors[][] ; //the colors for every rectangle
private double availWidth ;
private double availHeight ;
public HGrapher(String saveFileName, int numRects) throws IOException {
//*add window closer
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0); }
});
//*get colors to use
setColors(numRects) ;
//*figure out the size of the image and frame
this.availHeight = (3.0/4) * Toolkit.getDefaultToolkit().getScreenSize().height ;
this.availWidth = (3.0/4) * Toolkit.getDefaultToolkit().getScreenSize().width ;
//*create the image
this.img = new BufferedImage((int)availWidth, (int)availHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D drawer = img.createGraphics() ;
drawer.setBackground(Color.WHITE);
this.makeImg(drawer) ;
//*display the image
this.setSize(new Dimension((int)availWidth, (int)availHeight)) ;
this.setVisible(true);
//*save the image
ImageIO.write(img, "jpg",new File((saveFileName +".jpg")));
}
//*draws the image by filling rectangles whose color are specified by this.colors
public void makeImg(Graphics2D drawer) {
double rectWidth = this.availWidth/(double)colors.length ;
for(int i = 0 ; i < colors.length ; i ++) {
drawer.setColor(new Color(this.colors[i][0], this.colors[i][1], this.colors[i][2],
this.colors[i][3])) ;
drawer.fill(new Rectangle2D.Double(rectWidth*i, 0, rectWidth, this.availHeight)) ;
}
}
//*paint method
public void paint(Graphics g) {
Graphics2D drawer = (Graphics2D)g ;
drawer.drawImage(img, 0, 0, null) ;
}
//*creates an array of the colors rectangles are filled with
public void setColors(int numRects) {
this.colors = new float[ numRects][4] ;
//*make every 1st rect red
for(int i = 0 ; i< colors.length ; i+= 3) {
this.colors[i][0] = (float).8 ; this.colors[i][1] = (float).1 ; this.colors[i][2] = (float).1 ;
this.colors[i][3] = (float).8 ; }
//*make every 2nd rect green
for(int i = 1 ; i< colors.length ; i+= 3) {
this.colors[i][0] = (float).1 ; this.colors[i][1] = (float).8 ; this.colors[i][2] = (float).1 ;
this.colors[i][3] = (float).8 ; }
//*make every 3rd rect
for(int i = 2 ; i< colors.length ; i+= 3) {
this.colors[i][0] = (float).1 ; this.colors[i][1] = (float).1 ; this.colors[i][2] = (float).8 ;
this.colors[i][3] = (float).8 ; }
}
public static void main (String[]args) throws IOException {
HGrapher hg = new HGrapher("saved", 14) ;
}
}
Gracias a Peter! Ese enfoque no funciona con un formato .jpg (resulta en una imagen negra pura) pero funciona con un formato .png, ¡lo cual es suficiente para mí! Estoy parcialmente inclinado a preguntar por qué funciona con un formato y no con otro ... de todos modos, ¡gracias Peter! – whearyou
'clearRect()' probablemente deje un valor alfa de 0. JPG no admite transparencia y probablemente se vuelva negro por defecto si algo tiene un alfa de 0. Puede usar 'setColor()' y 'fillRect()' en lugar de 'setBackground() 'y' clearRect() 'para que funcione con JPG – PeterT