2012-12-27 3 views
2

자바로 작은 이미지 처리를하려고합니다. 사용자는 버튼을 클릭하여 이미지를로드하고 이미지를 쉽게 수정할 수 있어야합니다. 이미지로드 및 표시는 문제가 없지만 이진 이미지를 만들 때 repaint() 메서드를 사용하면 화면에 검은 색 이미지가 표시됩니다. 문제는 repaint() - 메서드가 있다고 생각합니다. 검색 기능과 Google을 이미 사용했지만 코드에 무엇이 잘못되었는지 전혀 알 수 없습니다. 그건 내가 지금까지이 작업은 다음과 같습니다Repaint BufferedImage

public class ImageProcessing extends JFrame implements ActionListener { 

    private JPanel imagePanel; 
    private JPanel buttonPanel; 
    private JButton binaryButton; 
    private JButton loadButton;  
    private BufferedImage image;  
    private final String WINDOW_TITLE = "Image Processing"; 

    public ImageProcessing() { 
     createWindow(); 
    } 

    private void createWindow() { 
     this.setTitle(WINDOW_TITLE); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
     this.setSize(500, 500); 

     imagePanel = new ImagePanel(); 
     buttonPanel = new JPanel(); 
     this.add(imagePanel, BorderLayout.CENTER); 

     loadButton = new JButton("Load image"); 
     loadButton.addActionListener(this); 
     buttonPanel.add(loadButton); 
     this.add(buttonPanel, BorderLayout.SOUTH); 

     binaryButton = new JButton("binary"); 
     binaryButton.addActionListener(this); 
     buttonPanel.add(binaryButton); 

     this.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == this.loadButton) { 
      String filePath = getImageFile(); 
     if (filePath != null) { 
      try { 
      image = ImageIO.read(new File(filePath)); 
      // imageBackup = image; 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
      this.repaint(); 
     } 
     } else if (e.getSource() == this.binaryButton) { 
      image = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY); 
      imagePanel = new ImagePanel(); 
      this.repaint(); 
     } 
    } 

    private String getImageFile() { 
     JFileChooser chooser = new JFileChooser(); 
     int result = chooser.showOpenDialog(null); 
     File file = null; 
     if (result == JFileChooser.APPROVE_OPTION) { 
      file = chooser.getSelectedFile(); 
      return file.getPath(); 
     } else 
      return null; 
    }  

    class ImagePanel extends JPanel { 
     public void paint(Graphics g) { 
      g.drawImage(image, 0, 0, this); 
     }   
    } 
} 

난 당신이 나를 도와 내가 잘못 뭘하는지 설명 할 수 있기를 바랍니다. 미리 감사드립니다.

+2

진 버튼을 누른 후, ImagePanel의 새로운 인스턴스 변수 'imagePanel' 할당된다. 그러나이 새로운 ImagePanel은 JFrame에 추가되지 않습니다. 이전 ImagePanel은 JPanel에 남아 있습니다. – gogognome

+0

'BufferedImage.TYPE_BYTE_BINARY' 왜'image.getType()'과 반대되는 바이너리입니까? –

답변

3

당신이하려는 이미지 처리의 종류가 명확하지 않습니다. 코드.

image = new BufferedImage(
    image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY); 

. 바이트 바이너리 형식으로 새 (빈) 이미지를 만듭니다. 당신은 아무것도 그려 넣지 않았습니다. 그래서 그것이 검은 색입니다. (예를 원본 이미지를 복사하려고하는)

그것으로 그리려면 그래픽 컨텍스트 얻을 수 있습니다 :

Graphics2D g = image.createGraphics(); 

을 그리고 같은과 복사 :

g.drawImage(otherImage, 0, 0, this); 

나 ' Java가 전체 깊이 RGB 이미지에서 TYPE_BYTE_BINARY으로 변환 할 것인지 또는 어떻게 할 것인지 확실하지 않습니다. 예외가 발생할 수 있습니다.

+0

이미지를 이진 이미지로 변환하려고했습니다. 고마워! 이미지를 만들지 만 그리지 않는 것이 문제였습니다. 바보 나! – user1932782

+1

도움이된다면 대답을 받아들이는 것이 좋을 것입니다. – Gene

+0

대답을 수락하는 방법에 대한 정보 (SO가 허락하는 경우) (http://meta.stackexchange.com/a/65088/155831) –

1

이미지 대신 이미지 패널을 바꿉니다. 또한 이진 이미지에서 실제 페인팅을 수행하지 않습니다. 여기 이진 원본 이미지로 변환하는 방법의 예이고, 이는 제공된 코드에 기초한다 :

else if (e.getSource() == this.binaryButton) { 
    BufferedImage mask = new BufferedImage(image.getWidth(), 
      image.getHeight(), BufferedImage.TYPE_BYTE_BINARY); 
    Graphics g = mask.getGraphics(); 
    g.drawImage(image, 0, 0, this); 
    g.dispose(); 
    image = mask; 
    this.repaint(); 
}