2012-10-16 4 views
0

사용자가 마우스를 클릭하고 드래그하여 이미지를 그릴 수있는 웹 사이트 용 Java 애플릿을 만듭니다. 그런 다음이 이미지를 1과 0이있는 2 차원 배열의 형태로 흑백 이미지로 변환하려고합니다. 드로잉 부분을 만들었지 만 애플릿에서 2 차원 배열로 어떻게 이동해야하는지 모르겠습니다. 어떤 제안?Java 애플릿을 흑백 이미지로 변환

+1

나는 이미지를 이미지로 만드는 것이 더 낫다고 생각합니다. 여기에 당신이하려고하는 것에 대한 [가까운 동등 물] (http://stackoverflow.com/questions/12683533/drawing-a-rectangle-that-wont-disappear-in-next-paint/12683632#12683632) 페인팅 서피스로'BufferedImage'를 사용합니다. 그런 접근법이 마음에 든다면 나는 그것을 답으로 여기에 넣을 수 있습니다. OTOH - 당신이하려고하는 것보다 문자 그대로 [[ComponentImageCapture'] (http://stackoverflow.com/a/5853992/418556)도 참조하십시오. –

답변

0

먼저 화면을 BufferedImage으로 변환하면 픽셀 데이터에 액세스 할 수 있습니다.

뭔가 같은 ...

BufferedImage buffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 
Graphics2D g2d = buffer.createGraphics(); 
printAll(g2d); 
g2d.dispose(); 

다음으로, 당신은 당신이 원시 데이터에 액세스 할 수 있습니다, 지금은 ... 검은 색과 흰색 이미지

BufferedImage bwImage = new BufferedImage(
     buffer .getWidth(), 
     buffer .getHeight(), 
     BufferedImage.TYPE_BYTE_BINARY); 

Graphics2D g2d = bwImage.createGraphics(); 
g2d.drawImage(buffer , 0, 0, null); 
g2d.dispose(); 

을 그 변환해야 ...

for (int y = 0; y < bwImage.getHeight(); y++) { 
    for (int x = 0; x < bwImage.getWidth(); x++) { 

     Color color = new Color(bwImage.getRGB(x, y)); 
     // You should only be interested in colors of 0,0,0 RGB 

    } 
} 

예에 UPDATED 617,451,515,

이것은 내가

Color

Black And White

public class MyPaint { 

    public static void main(String[] args) { 
     new MyPaint(); 
    } 

    public MyPaint() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setSize(500, 600); 
       frame.getContentPane().setBackground(Color.DARK_GRAY); 
       frame.setLocationRelativeTo(null); 
       frame.setLayout(new GridBagLayout()); 

       final PaintSurfacePane surface = new PaintSurfacePane(); 
       JPanel pnlButtons = new JPanel(new GridBagLayout()); 
       pnlButtons.setOpaque(false); 

       JButton saveFromImage = new JButton("Save From Image"); 
       JButton saveFromGraphics = new JButton("Save From Grpahics"); 

       pnlButtons.add(saveFromImage); 
       pnlButtons.add(saveFromGraphics); 

       saveFromGraphics.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         BufferedImage buffer = new BufferedImage(surface.getWidth(), surface.getHeight(), BufferedImage.TYPE_INT_RGB); 
         Graphics2D g2d = buffer.createGraphics(); 
         surface.printAll(g2d); 
         g2d.dispose(); 

         renderBlackWhite(buffer); 
        } 

       }); 

       saveFromImage.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         BufferedImage buffer = new BufferedImage(surface.getWidth(), surface.getHeight(), BufferedImage.TYPE_INT_RGB); 
         Graphics2D g2d = buffer.createGraphics(); 
         g2d.drawImage(surface.getPaintSurface(), 0, 0, surface); 
         g2d.dispose(); 

         renderBlackWhite(buffer); 
        } 

       }); 

       GridBagConstraints gbc = new GridBagConstraints(); 
       gbc.gridx = 0; 
       gbc.gridy = 0; 
       gbc.weightx = 1; 
       gbc.weighty = 1; 

       frame.add(surface, gbc); 

       gbc.gridy++; 
       gbc.weighty = 0; 
       frame.add(pnlButtons, gbc); 

       frame.setVisible(true); 
      } 
     }); 
    } 

    public static void renderBlackWhite(BufferedImage buffer) { 
     BufferedImage bwImage = new BufferedImage(
         buffer.getWidth(), 
         buffer.getHeight(), 
         BufferedImage.TYPE_BYTE_BINARY); 

     Graphics2D g2d = bwImage.createGraphics(); 
     g2d.drawImage(buffer, 0, 0, null); 
     g2d.dispose(); 

     JFrame frame = new JFrame("Black and White"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setLayout(new BorderLayout()); 
     frame.add(new JLabel(new ImageIcon(bwImage))); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public class PaintSurfacePane extends JPanel { 

     private BufferedImage paintSurface; 

     public PaintSurfacePane() {  
      // This will produce a buffered image that will render faster... 
      GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); 
      paintSurface = gc.createCompatibleImage(400, 400, Transparency.OPAQUE); 
      Graphics2D g2d = paintSurface.createGraphics(); 
      g2d.setColor(Color.WHITE); 
      g2d.fillRect(0, 0, 400, 400); 
      g2d.dispose(); 

      MouseHandler handler = new MouseHandler(); 
      addMouseListener(handler); 
      addMouseMotionListener(handler); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(paintSurface, 0, 0, this); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(400, 400); 
     } 

     @Override 
     public Dimension getMinimumSize() { 
      return getPreferredSize(); 
     } 

     @Override 
     public Dimension getMaximumSize() { 
      return getPreferredSize(); 
     } 

     public BufferedImage getPaintSurface() { 
      return paintSurface; 
     } 

     protected class MouseHandler extends MouseAdapter implements MouseMotionListener { 

      private Point startPoint; 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       startPoint = null; 
      } 

      @Override 
      public void mouseDragged(MouseEvent e) { 
       Point endPoint = e.getPoint(); 
       if (startPoint != null) { 
        Graphics2D g2d = paintSurface.createGraphics(); 
        g2d.setColor(Color.RED); 
        g2d.draw(new Line2D.Float(startPoint, endPoint)); 
        g2d.dispose(); 

        repaint(); 
       } 

       startPoint = endPoint; 
      } 

      @Override 
      public void mouseMoved(MouseEvent e) { 
      } 
     } 
    } 
} 

은 본질적으로는 "직접 버퍼에서"접근 방식과 그래픽을 변환 할 수있는 "페인트"접근 방식을 사용하는 이전 질문에서 채택 된 예입니다 흑백으로.

+0

두 번째 BufferedImage를 bwImage 대신 이미지로 선언 하시겠습니까? 나중에 변수 이름 이미지를 사용하여 해당 이미지를 참조하기 때문입니다. 또한,이 코드를 시도했지만,이 새로운 이미지를 화면에 표시 할 때 검은 색 대신에 완전히 검은 색 화면을 얻었습니다. 다른 곳에서는 흰색을 그렸습니다. 이렇게하려면 "g.drawImage (image, 0,0, null);"명령을 사용했습니다. 여기서 g는 내 Graphics 객체입니다. 이 올바른지? – Nate

+0

첫째, 참조 오류를 수정하는 코드를 업데이트했습니다. 실수였습니다. 죄송합니다. 둘째로, 나는 당신이 애플릿의 그래픽 컨텍스트 (paint 메서드 중 하나를 재정의)에 직접적으로 이끌었다 고 가정합니다. 백업 버퍼를 사용했다면 첫 번째 단계를 건너 뛰고 바로 사용하십시오. 'getGraphics'를 사용했다면 문제가 생깁니다. – MadProgrammer

+0

나는 페인트 법을 오버라이드하여 getGraphics를 내 코드 전체에서 호출했습니다. getGraphics를 사용할 때의 문제점은 무엇입니까? 추가 코멘트, 위의 코드를 사용할 때 픽셀 값을 분석했는데 단일 값이 아닌 경우 1입니다. – Nate