2011-12-07 17 views
5

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

    } 

Respuesta

9

setBackground() solamente establecer el color que se utiliza para borrar la imagen, en realidad no borrar la imagen. Llame al Graphics.clearRect(int,int,int,int) después de setBackground(). De la misma manera:

//*create the image 
this.img = new BufferedImage((int)availWidth, (int)availHeight, BufferedImage.TYPE_INT_ARGB); 
Graphics2D drawer = img.createGraphics() ; 
drawer.setBackground(Color.WHITE); 
drawer.clearRect(0,0,(int)availWidth,(int)availHeight); 
+1

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

+0

'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

Cuestiones relacionadas