2011-08-11 24 views
5

Tengo una imagen de tamaño w por h. En Java, necesito crear una imagen que tenga el tamaño w por h+20 donde la parte superior w por 20 pixels es blanca, y el resto de la imagen es la misma que la imagen original.¿Cómo agregar 20 píxeles de blanco en la parte superior de un archivo de imagen existente?

Básicamente, quiero saber cómo puedo agregar 20 píxeles de blanco a la parte superior de una imagen almacenada en el búfer existente.

Por lo tanto, sería algo así como:

public static void main (String[] args) { 
    BufferedImage originalImage = [the original image with a specific file path]; 
    ...code to create a new image 20 pixels higher... 
    ...code to paint originalImage 20 pixels down on the new image 
    ...code to save the new image... 
} 
+1

¿Cuál es tu pregunta? –

+0

@Amir, "Básicamente, quiero saber cómo puedo agregar 20 píxeles de blanco a la parte superior de una imagen almacenada en el búfer existente". – jjnguy

Respuesta

12

Sugerencia:

  1. Uso GraphicsConfiguration.createCompatibleImage(int width, int height) para crear un BufferedImage de la misma anchura, pero con una altura que es 20.
  2. Utilice BufferedImage.createGraphics() para obtener el objeto Graphics2D de esta imagen.
  3. Uso Graphics.setColor(Color c) y Graphics.fillRect(int x, int y, int width, int height) para dibujar la parte superior blanca
  4. Uso Graphics.drawImage(Image img, int x, int y, ImageObserver observer) para dibujar la imagen original a las coordenadas especificadas de la nueva imagen.
  5. Para guardar la nueva imagen, lea el tutorial Writing/Saving an Image.

import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.Graphics2D; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsEnvironment; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class ImageManipulationDemo { 
    private static BufferedImage ORIGINAL; 
    private static BufferedImage ALTERED; 
    private static final GraphicsConfiguration config = 
     GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); 

    public static void main(String[] args) { 
     try { 
      loadImages(); 

      SwingUtilities.invokeLater(new Runnable(){ 
       @Override 
       public void run() { 
        createAndShowGUI();    
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static void loadImages() throws IOException { 
     ORIGINAL = ImageIO.read(
       ImageManipulationDemo.class.getResource("../resources/whitefro1.jpg")); 
     ALTERED = config.createCompatibleImage(
       ORIGINAL.getWidth(), 
       ORIGINAL.getHeight() + 20); 
     Graphics2D g2 = ALTERED.createGraphics(); 
     g2.setColor(Color.WHITE); 
     g2.fillRect(0, 0, ALTERED.getWidth(), 20); 
     g2.drawImage(ORIGINAL, 0, 20, null); 
     g2.dispose(); 

     // Save image 
     ImageIO.write(ALTERED, "PNG", new File("alteredImage.png")); 
    } 

    private static void createAndShowGUI() { 
     final JFrame frame = new JFrame("Image Manipulation Demo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setBackground(Color.BLUE.darker()); 
     frame.getContentPane().setLayout(new FlowLayout()); 
     frame.getContentPane().add(new JLabel(new ImageIcon(ORIGINAL))); 
     frame.getContentPane().add(new JLabel(new ImageIcon(ALTERED))); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

enter image description here

1

Esto es posible, es necesario investigar y BufferedImageGraphic2D. Puede recuperar Graphic2D del BufferedImage para manipular y dibujar en su imagen.

Básicamente, debe crear una segunda imagen con una mayor dimensión y dibujar la primera en la posición correcta para dejar espacio en blanco en la primera.

2

Sí, tiene sentido. Por ejemplo:

public static void main (String[] args) { 
     BufferedImage originalImage = [the original image with a specific file path]; 
     BufferedImage newImage = new BufferedImage(originalImage.getWidth() + 20 , originalImage.getHeight() + 20 , YOUR_IMAGE_TYPE); 
     for (int i = 0 ; i < newImage.getHeight() ; i++){ 
      for (int j = 0 ; j < newImage.getWidth() ; j++){ 
       if (j > 20 && i > 20){ 
        newImage.setRGB(i,j, originalImage.getRGB(i - 20, j - 20)); 
       } else{ 
        newImage.setRGB(i,j, YOUR_RGB_VAL); 
       } 
      } 
     } 
    } 

P.S. Espero que el código sea correcto. No lo probé, solo lo escribí sobre la marcha.

Cuestiones relacionadas