2013-05-13 2 views
1

ImageBufferedImage으로 변환하고 싶습니다.ToolkitImage getBufferedImage()가 null을 반환하는 이유는 무엇입니까?

Image tmp; 
... //read, scale 
BufferedImage buffered = new BufferedImage(SMALL_SIZE, SMALL_SIZE, 
       BufferedImage.TYPE_INT_RGB); 
buffered.getGraphics().drawImage(tmp, 0, 0, null); 

를하지만 정말 느린 : 나는 다음 알고있다. 내가 픽셀 색 데이터를 얻어야하기 때문에 BufferedImage이 필요합니다.

ToolkitImage ti = (ToolkitImage) tmp; 
BufferedImage buffered = tmp.getBufferedImage(); 

를하지만 항상 null를 반환 나는 그림없이, 그것을 할 수있는 가능한 방법을 찾아 냈다. 누구든지이 솔루션을 제공 할 수 있습니까?

편집 : 더 큰 작업 (이 문제의 소스가) 여기에 있습니다 : Scale a BufferedImage the fastest and easiest way

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 또한, J2SE에는'ToolkitImage'가 없다는 것을 주목하십시오. 안드로이드를 사용하고 있습니까? –

+0

@AndrewThompson 질문을 편집했습니다. 지금은 더 좋습니까? ToolkitImage는 sun.awt.image.ToolkitImage에 있습니다. –

+0

패키지의'sun' 계층에서 클래스를 사용하지 마십시오! 그들은 다음 Oracle JRE에 없을 수도 있고 아마도 다른 제조업체의 JRE에도 없을 것입니다. –

답변

1

는 난 단지 JDK를 사용 BufferedImageImage을 변환하는 빠른 방법을 알고하지 않습니다. 제한이없는 경우 C 또는 C++에서 더 빠른 솔루션을 작성하고 JNI를 통해 액세스 할 수 있습니다. ImageMagick에는 빠르고, 최적화 된 루틴이 있습니다. 편집 :이 답변은 좋은 제안이 있습니다 https://stackoverflow.com/a/7726679/257299

다른 전략은 Image Toolkit.getImage(URL)를 호출하지 않도록하는 것입니다. 이 경우 BufferedImage으로 변환해야합니다. 대신, 시도 : BufferedImage ToolkitImage.getBufferedImage() 항상 null을 반환하는 이유에 대해 BufferedImage ImageIO.read(File)

을 :

  1. ToolkitImage는 JDK 공개 API의 일부로 간주되지 않는 sun 패키지의 일부입니다. 직접 사용하지 마십시오. 나는 알고있다. 스윙을 코딩한다면, 썬은 스윙에서 비공개 클래스를 많이 사용했기 때문에이 규칙을 자주 위반하는 사람들을 보게 될 것이다. (SwingUtilities 패키지 프라이빗 메소드와 클래스와 부적절한 것들의 모든 종류를한다.)를 버퍼링하여 이미지 TookitImage생성 내부적 되었다면 비 null 참조를 반환 getBufferedImage()
  2. 방법. 그 마지막 문장을 다시 읽으십시오. 중요한 용어는 이고이 생성되었습니다. 이 방법은 "무료"가 아니며 내부 데이터를 BufferedImage으로 변환하는 데 많은 처리 비용이 부과됩니다. 대부분 BufferedImage이 생성되지 않았으므로 (99 %) 반환 값은 null입니다. JDK Source Reference
1

같은 문제가있었습니다. 몇 가지 이상한 이유로 ImageIcon을 통해 이미지를 얻을 수있었습니다. 그래서 ImageIcon에 byteArray (imageDate)를로드 한 다음 ImageIcon에서 이미지를 읽었고 정상적으로 작동했습니다.

1

ToolkitImage에서 BufferedImage 로의 변환 문제가 발생했습니다.

Graphics2D g2d = buffImage.createGraphics(); 
g2d.drawImage(image, 0, 0, null); 
g2d.dispose(); 

는 - 버퍼링 이미지에 아무것도 그리기되지 않았다, 그리고 image.getBufferedImage(); 원래 Image 일부 internall 물건을 초기화하기 위해서 ImageIcon를 사용하여, 도움이 무엇인가 그 null

이었다.

ToolkitImage toolkitImage = (ToolkitImage) Toolkit.getDefaultToolkit().createImage("image.jpg"); 

Image temporary = new ImageIcon(toolkitImage).getImage(); 

BufferedImage buffImage = new BufferedImage(toolkitImage.getWidth(), toolkitImage.getHeight(), 
     BufferedImage.TYPE_INT_ARGB); 

Graphics2D g2d = buffImage.createGraphics(); 
g2d.drawImage(temporary, 0, 0, null); 
g2d.dispose(); 

그 후 buffImage toolkitImage에서 화상을 함유 하였다.

1

ToolkitImage에서 getHeight() 또는 getWidth() 메서드를 쿼리하면 BufferedImage 내부 생성이 트리거됩니다. 그래서 코드가 될 것이다 :

ToolkitImage ti = (ToolkitImage) tmp; 
ti.getWidth(); 
BufferedImage buffered = ti.getBufferedImage(); 

나는이 빨리 당신이 설명 drawImage() 방법보다 의심하지만, 시도 가치가있다.

관련 문제