2011-08-11 4 views
5

크기 w의 이미지가 h입니다. Java에서는 크기 w 인 이미지를 h+20으로 작성해야합니다. 여기서 w by 20 pixels은 흰색이고 나머지 이미지는 원본 이미지와 같습니다.기존 이미지 파일의 상단에 흰색 20 픽셀을 추가하는 방법은 무엇입니까?

본질적으로 기존 버퍼링 된 이미지의 맨 위에 흰색 20 픽셀을 추가하는 방법을 알고 싶습니다.

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

질문은 무엇입니까 ? –

+0

@Amir, "본질적으로 기존 버퍼링 된 이미지의 맨 위에 흰색 20 픽셀을 추가 할 수있는 방법을 알고 싶습니다." – jjnguy

답변

12

제안 :

  1. 사용 GraphicsConfiguration.createCompatibleImage(int width, int height)는하지만, +20의 높이와 같은 폭의 BufferedImage을 만들 수 있습니다.
  2. BufferedImage.createGraphics()을 사용하면이 이미지의 Graphics2D 개체를 얻을 수 있습니다.
  3. 사용 Graphics.setColor(Color c)
  4. Graphics.fillRect(int x, int y, int width, int height)은 새로운 이미지의 지정된 좌표에 원본 이미지를 그릴 흰색 상단
  5. 을 사용 Graphics.drawImage(Image img, int x, int y, ImageObserver observer)을 그립니다.
  6. 새 이미지를 저장하려면 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

이 가능하며, 당신이 BufferedImageGraphic2D을 조사해야합니다

그래서 뭔가를 할 것이다. BufferedImage에서 Graphic2D을 검색하여 이미지를 조작하고 그릴 수 있습니다.

기본적으로 더 큰 치수의 두 번째 이미지를 만들고 올바른 위치에 첫 번째 이미지를 그려서 첫 번째 이미지에 공백을 남겨 두어야합니다.

2

네, 맞습니다. 예 :

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. 코드가 맞기를 바랍니다. 나는 그것을 테스트하지는 않았지만 그것을 비행 중에 썼습니다.

관련 문제