2013-04-18 1 views
1

화면의 스냅 샷을 만들고 이미지를 저장하려고 할 때 이미지의 일부분을 얻으려고합니다. 는 조언 내가 마지막으로 무엇을 얻을 그래서 여기Raster를 RenderedImage로 변환하는 방법

Rectangle Rect = new Rectangle(10, 10, 50, 50); 
File file = new File("D:\\output.png"); 
RenderedImage renderedImage = SwingFXUtils.fromFXImage(browser.snapshot(null, null), null); 
try { 
    ImageIO.write((RenderedImage) renderedImage.getData(Rect),"png",file); 
       } catch (IOException ex { Logger.getLogger(JavaFXApplication3.class.getName()).log(Level.SEVERE, null, ex); 
       } 

를 얻을 행복 할 의지와 그것을 작동

     File file = new File("D:\\output.png"); 
       BufferedImage image = SwingFXUtils.fromFXImage(browser.snapshot(null, null), null); 
       try { 
        ImageIO.write(image.getSubimage(100, 100, 50, 50) , "png", file); 
       } catch (IOException ex) { 
        Logger.getLogger(JavaFXApplication3.class.getName()).log(Level.SEVERE, null, ex); 
       } 
+0

'작동하지 않음'을 자세히 설명해주세요. 결과물이 예상 한 것과 다른 것인가 아니면 예외가 발생합니까? –

+0

그것은 나에게 어떤 출력 이미지도주지 않았고 예외를 던지지 않았습니다. 프로그램이 막혔습니다. – Jason

+0

* "어떤 조언을받을 수있어서 기쁠 것입니다."* 1) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 2) 명시된 작업은 J2SE에서 수행 할 수 있습니다. SwingFXUtils가 필요 없습니다. 3) * "does not work"* 어쩌면 피곤할지도 모른다. 이 시점에서 모호하지 마십시오. 발생한 오류 또는 예외 출력을 복사/붙여 넣기하거나 일어난 일과 발생한 일을 정확하게 설명하십시오. 4) 코드 블록에 일관되고 논리적 인 들여 쓰기를 사용하십시오. 코드의 들여 쓰기는 사람들이 프로그램 흐름을 이해하도록 돕기위한 것입니다! –

답변

2

여기 내 생각 엔 당신이 문제가 캐스팅가있는 것이 될 것으로 .getData() 방법에서 검색 한 Raster 이미지. 래스터를 기술적으로 가져 와서 WritableRaster으로 변환하고 RenderedImage으로 마무리해야하지만 기본적으로 이미지의 일부를 복사하는 것이 좋습니다. SSCE 빠른 :

import javax.imageio.ImageIO; 
import java.awt.*; 
import java.awt.image.*; 
import java.io.File; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     BufferedImage original = new BufferedImage(100, 100, BufferedImage.TYPE_3BYTE_BGR); 
     // Crop away 10 pixels pixels and only copy 40 * 40 (the width and height of the copy-image) 
     BufferedImage copy  = original.getSubimage(10, 10, 50, 50); 

     ImageIO.write(copy, "png", new File("Test.png")); 
    } 

} 

이 나를 위해 작동하므로이 더 문제로 실행하면 사용자가 입력이 제대로 페치 것을 확인하는 것이 좋습니다. 문제가 프로그램이 "멈췄다"면 위의 코드를 더미 이미지로 먼저 시도해보십시오. 나는 getSubimage라는 방법이 있었다 몰랐다, 그래서 나는 방법에 위의 코드를 대체 :

편집 :-) 도움이

희망. Andrew Thompson에게 감사드립니다.

1

일단 앱을 다운로드하면 BufferedImage에 대한 참조가있는 경우 subImage(Rectangle) 메서드를 사용하여 더 작은 이미지를 만듭니다.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

class ScreenSubImage { 

    public static void main(String[] args) throws Exception { 
     Robot robot = new Robot(); 
     Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
     BufferedImage image = robot.createScreenCapture(new Rectangle(d)); 
     BufferedImage sub = image.getSubimage(0, 0, 400, 400); 
     File f = new File("SubImage.png"); 
     ImageIO.write(sub, "png", f); 
     final ImageIcon im = new ImageIcon(f.toURI().toURL()); 

     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       JOptionPane.showMessageDialog(null, new JLabel(im)); 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html 
     SwingUtilities.invokeLater(r); 
    } 
}