2012-08-15 3 views
1

Image를 BufferedImage로 읽어 들이고, JFrame에 페인트하고, 원을 그려서 파일에 씁니다.JFrame에서 BufferedImage를 페인트하여 파일에 쓰기

다음 코드는 저장된 파일의 내용을 제외한 모든 코드를 처리합니다. 저장된 이미지에는 변경되지 않은 BufferedImage 만 포함됩니다. No Circles;) 나는 이미 코드를 변경하고 추가함으로써 그것을 이해하려고 손질했지만, 많은 도움이되지 못했다.

public class PaintImage extends Component { 

BufferedImage img; 
private int pngWidth, pngHeight; 

public int getPngWidth() { 
    return pngWidth; 
} 

public int getPngHeight() { 
    return pngHeight; 
} 

public void paint(Graphics g) { 
    super.paint(g); 

//g = img.createGraphics(); 
g.drawImage(img, 0, 0, 809, 1080, null); 
g.drawOval(33, 33, 444, 444); 
} 

public PaintImage() { 
try { 
    img = ImageIO.read(new File("C:\\karte_vorlage.png")); 
    pngWidth = img.getWidth(); 
    pngHeight = img.getHeight(); 

} catch (IOException e) { 
} 
} 

public void writeImage() { 
    try { 
    img.getGraphics(); 
     ImageIO.write(img, "png", new File("C:\\save.png")); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
} 


} 

의 주석 img.createGraphics g =(); 이미지가 손상됩니다.

도와주세요. 모두에게 미리 감사드립니다.

편집 : 1. paint (Graphics g) 메서드가 두 번 호출됩니다. 최소화 할 경우 다시 두 번 호출됩니다.

+0

* ".. 클래스 PaintImage이 구성 요소는 확장"* 허 : 예를 들어, 클릭 버튼이 같은 방법을 실행할 때. 스윙 부분은 어디에 있습니까? 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

저는이 예제에서 "paint (Graphics g)"라는 메서드가 두 번 호출된다는 것을 눈치 챘습니다. 최소화하고 최대화하면 두 번 다시 호출됩니다. 왜 두 번? 그것을 인식하는 System.out을 추가했습니다. – Kronos

답변

2

당신은 간단한 페인트 당신은 더 나은 귀하의 요구 사항을 충족하기 위해 폭 & 높이 놀러 할 수있는 BufferedImage

BufferedImage tempImage = new BufferedImage(imagePane.getWidth(), imagePane.getHeight(), BufferedImage.TYPE_INT_ARGB); 
Graphics2D g = tempImage.createGraphics(); 

imagePane.printAll(g); 

ImageIO.write(tempImage, "png", new File("C:\\save.png")); 

에 직접 구성 요소는

업데이트 할 수 있지만 계속 생각 해봐.

(width & height 같은 분명히 당신은 몇 가지 더 많은 정보를 알고 싶습니다) "페인트 관리자"또는 "페인트 가능"인터페이스의 일종을 생성하는 것, 그건 Graphics 내용 자체를 칠 수 주어진 또 다른 아이디어

이것은 어디에서 페인트했는지는 중요하지 않다는 것을 의미합니다.

다른 것은 다시 당신은 당신의 디자인을 변경해야합니다

0

다른 방법으로 이미지에 원을 그립니다. 언제든지이 다른 방법을 호출 할 수 있습니다. 그런 다음 페인트 메서드에서 이미지를 구성 요소에 그릴뿐입니다.

public void paint(Graphics g) { 
    super.paint(g); 
    g.drawImage(img, 0, 0, 809, 1080, null); 
} 

public void drawCircle() { 
    Graphics g = img.getGraphics(); 
    g.drawOval(33, 33, 444, 444); 
} 

또한 img.getGraphics(); writeImage 메소드에서 필요하지 않기 때문에.

+0

BufferedImage를 캔버스처럼 취급하고 싶다는 것을 잊어 버렸습니다. 런타임 중에 변경 사항이 있으므로 원본 이미지를 새로 고침하여 새로운 원을 그릴 수 있습니다. Jframe을 직접 그려서는 안되지만 결과 (모든 원이 BufferedImage에 그려지는 경우)가 표시되어야합니다. 사용자가이를 내보내려는 경우 프로그램은 BufferedImage를 원본 크기로 저장하고 서클을 저장합니다. 다소 혼란 스럽지만 쉬운 방법으로 설명하는 법을 모르겠습니다. 게다가 내 모국어가 아니야. :) 대단히 감사합니다. – Kronos

+0

'표시/편집 할 원이있는 이미지를 저장 한 다음 저장하는 것'이라고 생각하십니까? BTW - SSCCE를 게시하십시오. –

+0

미안하지만 SSCCE를 게시하기 위해 무엇을해야할지 모르십니까?! : ( – Kronos

0

paintable를 페인트하고자하는 방법에 대한 렌더러 (기본 크기 같은)

그냥 아이디어에 대한 힌트를 제공하는 것 같아서입니다. 다음과 같이 시도하십시오 :

  1. png 파일을 읽고이를 bufferedImage에 저장하십시오.
  2. paint() 메서드를 변경하십시오 (이것은 매우 중요합니다. 은 addtional 요소가있는 새로운 이미지이지만 코드는 에 먼저 png를 그리고 UI에 타원을 그립니다). 그것은 bufferedImage를 변경하지 않습니다. 자신의 이벤트를 추가하여 bufferedImage를 변경하십시오.

무효 foo는 (BufferedImage의) {

g = bufferedImage.getGraphis(); 
    g.drawSomething(); 
} 
public void paint(Graphics g) { 
    g.drawImage(bufferedImage); 
}