2012-11-29 2 views
1

작은 자바 프로그램이 png 이미지를 어둡게하려고합니다. 내 Mac에서는 잘 작동하지만 java 1.7_07이 설치된 Windows PC에서 실행하려고 할 때 빈 JPanel을 제외하고 전혀 표시되지 않으면 이미지가 완전히 사라집니다.Windows 7 64 비트에서 Graphics2D 문제를 사용하여 이미지가 어두워졌습니다.

class MapCanvas extends JPanel { 
    private Color color; 
    RescaleOp op; 
    BufferedImage sourceImage, bi; 

    public MapCanvas() { 
     try { 
      sourceImage = ImageIO.read(new File(MAP_FILENAME)); 

      bi = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_INT_ARGB); 

      op = new RescaleOp(.8f, 0, null); 
      bi = op.filter(bi, null); 

      Graphics2D g = bi.createGraphics(); 

      g.drawImage(sourceImage, 0, 0, 500, 382, null); 
      g.dispose(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // set size for the panel 
     Dimension size = new Dimension(500, 382); 
     this.setBackground(new Color(34, 102, 187)); 
     setPreferredSize(size); 
     setSize(size); 
     setLayout(null); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g2d = (Graphics2D) g; 

     g2d.drawImage(bi, op, 0, 0); 
    } 
} 

누구든지 내가이납니다 이유를 알고 : 여기

코드인가? 많은 감사합니다. 이 작업을 완료 한 이유

+6

"예상대로 작동하지 않습니다"- 그 다음 할 무엇을, 어떻게 당신이 예상과 다르다? "작동하지 않는다"고 말하는 것이 아니라 설명하십시오. 그렇지 않으면 사람들이 당신을 도우려고 힘듭니다. – Jesper

+0

죄송합니다. 이미 수정했습니다. 문제는 캔버스가 비어있어 이미지를 표시하지 않는다는 것입니다. – tuanva

+1

참고로 완벽한 예제가 있습니다 [here] (http://stackoverflow.com/a/5864503/230513). – trashgod

답변

0

내가 어떤 문제가하지 않는 것,하지만, 몇 가지 예에 대해 나 뛰어 ... 첫째

, 나는 ...

표시되지 않습니다 그리고 이런 짓을
try { 
    sourceImage = ImageIO.read(new File("C:/Users/shane/Dropbox/issue453.jpg")); 

    bi = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_INT_ARGB); 

    op = new RescaleOp(.1f, 0, null); 
    bi = op.filter(bi, null); 

    Graphics2D g = bi.createGraphics(); 

    g.drawImage(sourceImage, 0, 0, 500, 382, null); 
    g.dispose(); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

...

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

    g2d = (Graphics2D) g; 
    g2d.drawImage(bi, op, 0, 0); 
} 

넌 기본적으로 두 배 RescaleOp을 적용합니다.

그것은 단순히 직접 sourceImageRescaleOp을 적용 할 수 ... 당신이 간단한 어떤 BufferedImageOp

g2d.drawImage(bi, 0, 0, this); 
없이 bi을 그릴해야하는 경우, 성능에 대한 우려하지 않는 한

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

    g2d = (Graphics2D) g; 
    g2d.drawImage(sourceImage, op, 0, 0); 
} 

paintComponent 메서드에서 g2d을 정의하지 않았기 때문에 예제가 컴파일되지 않습니다. 이것은 감시 (괜찮습니다) 또는 Graphics 개체를 캐싱하는 것이므로 좋지 않습니다.

Graphics 개체는 상태가 저장되지 않으며 다시 칠하기 사이에 유지되지 않으므로 절대로 캐시하지 말고 getGraphics에 의존해야합니다.

0

내 실수를 지적 해 주셔서 감사합니다. 내 질문에 일부 누락 된 코드가 있습니다 (Graphics2D g2d - 그냥 할당되지 않은 변수) 그래서 컴파일되지 않습니다. 미안합니다.

는 그것을 고정하는 방법이다 :

  `sourceImage = ImageIO.read(new File(MAP_FILENAME)); 

      bi = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_INT_ARGB); 

      float[] scales = { .5f, .5f, .5f, 1f }; 
      float[] offsets = new float[4]; 
      op = new RescaleOp(scales, offsets, null); 

      Graphics2D g1 = bi.createGraphics(); 

      g1.drawImage(sourceImage, 0, 0, 500, 382, null); 
      g1.dispose(); 

      op.filter(sourceImage, bi);` 

는 I는 그 필터링 된 이미지를 그릴 (그게 있어야 방법) 비늘 배열 RGB에 대해 동일한 값을 사용한다.

  `g2d.drawImage(bi, 0, 0, 500, 382, null);` 

건배

관련 문제