2012-09-10 3 views
1

어제 Robot 클래스를 발견했으며 매우 멋지다고 생각했습니다. 오늘 나는 그것으로 실험하고 가능한 것을 보길 원했다. 그래서 전체 화면의 스크린 샷을 찍은 프로그램을 만들고 JPanel에서 픽셀 단위로 이미지를 렌더링하기로 결정했습니다. 프로그램을 마쳤습니다 (두 개의 클래스),하지만 작동하지 않습니다 그리고 나는 이유를 찾을 수 없습니다 (코드를 몇 번 보았다). 여기 코드는 다음과 같습니다Java 스크린 샷 (Robot 및 BufferedImage.getRGB 사용)

(FIRST CLASS)

import java.awt.AWTException; 
import java.awt.FlowLayout; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame; 

public class One { 
    public static void main(String[] args) { 
     BufferedImage screenCap = null; 
     Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 
     try { 
      screenCap = new Robot().createScreenCapture(screenRect); 
      Two imageRenderer = new Two(screenCap, screenRect); 
      imageRenderer.doRender(); 
      JFrame frame = new JFrame(); 
      frame.setVisible(true); 
      frame.setResizable(false); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLayout(new FlowLayout()); 
      frame.add(imageRenderer); 
      frame.pack(); 
     } catch (AWTException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

(제 2 유형)

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import javax.swing.JPanel; 

public class Two extends JPanel { 
    private BufferedImage screenCap; 
    private Rectangle screenRect; 

    private Color pixelRGB; 
    //c1 and c2 are the x and y co-ordinates of the selected pixel. 
    private int c1, c2; 

    public Two(BufferedImage sC, Rectangle rect) { 
     screenCap = sC; 
     screenRect = rect; 
     setPreferredSize(new Dimension(rect.width, rect.height)); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     setBackground(Color.WHITE); 

     g.setColor(pixelRGB); 
     g.drawRect(c1, c2, 1, 1); 
    } 

    public void doRender() { 
     for(int i=0; i<screenRect.width; i++) { 
      for(int j=0; j<screenRect.height; j++) { 
       pixelRGB = new Color(screenCap.getRGB(i, j)); 
       c1 = i; 
       c2 = j; 
       repaint(); 
      } 
     } 
    } 
} 

나는 아무 소용이 문제를 해결 봤있다.

누구든지 내가 뭘 잘못하고 있다고 말할 수 있습니까?

+1

'Two'는'screenCap'을 표시하고있는'JLabel'의 인스턴스 여야합니다. –

답변

0

다시 칠할 때마다 전체 패널에 흰색을 칠한 다음 단일 픽셀 만 수행합니다. 따라서 각각의 픽셀을 얻은 후에는 하나의 픽셀 만 얻습니다. 또한 repaint 번으로 전화 할 필요가 없습니다. 실제로 repaint으로 전화를 걸면 실제로는 paintComponent이 호출되지 않습니다. 그것은 단순히 스윙이 결국 다시 칠하는 요청을 제출합니다. 그리고 그것은 일대일이 아닐 수도 있습니다. 예를 들어 repaint 번으로 전화를 많이 걸면 paintComponent 번으로 전화가 걸릴 수 있습니다. paintComponent을 한 번 호출하면 구성 요소가 완전히 표시되도록 코드를 작성해야합니다.

이렇게하려면 g.drawImage을 사용하여 BufferedImage를 표시 할 수 있습니다. JPanel에 이미지를 표시하는 방법에 대한 자세한 내용은 this 게시물을 참조하십시오. , 그것이 작동되도록하기 위해서는

3

은 다음과 같이 클래스 TwopaintComponent() 방법을 대체 :

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    setBackground(Color.WHITE); 
    g.drawImage(screenCap, 0, 0, getWidth(), getHeight(), null); 
} 

당신은 또한 doRender() 방법을 제거 할 수 있습니다.

+0

아, 고마워! 나는 drawImage()에 대해 몰랐다. (여전히 API를 알게되었다) –

1

TwoJLabel의 인스턴스이어야하며 screenCap이 표시되어야합니다. E.G.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

public class Screenshot { 

    public static void main(String[] args) throws Exception { 
     Rectangle screenRect = new Rectangle(
       Toolkit.getDefaultToolkit().getScreenSize()); 

     final BufferedImage screenCap = 
       new Robot().createScreenCapture(screenRect); 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       JOptionPane.showMessageDialog(null, new ImageIcon(screenCap)); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 

정말로 멋지다면 스크롤 창에 놓으십시오. 배터리는 포함되어 있지 않습니다.

명백하지 않은 경우 : JOptionPaneJLabel을 사용하여 ImageIcon을 렌더링합니다.