2016-11-01 2 views
0

안녕하세요 이미지의 5 개보기를 표시하는 스크롤 패널 내에서 클릭 좌표의 rgb를 가져 오려고합니다. ImageView은 화면 크기에 적합하지만 원래 이미지는 약 8k x 4k 픽셀입니다. 아래는 rgb를 찾는 나의 시도이지만, 나는이 이미지를 사용했다는 사실에도 불구하고 입력 파일 예외를 일관성있게 읽을 수 없다. 내가 클릭 코드에 SCALE_TOTAL이벤트의 노드 좌표 가져 오기 및 BufferedImage에서 RGB 읽기 Javafx

으로 표시 줌 총 구현 줌 정비사가주의하는 것이 아마 관련이

 mapScroll.addEventFilter(MouseEvent.MOUSE_CLICKED, e -> { 
     File mapFile = new File("WorldProvincialMap-v1.01.png"); 
     commandOutput.setText(commandOutput.getText() + " \n" + e.getSceneX() + " " + e.getSceneY()); 
     try { 
      BufferedImage mapBuffered = ImageIO.read(mapFile); 
      int rgb = 0; 
      if(mapScroll.getHvalue() < 0.2) 
      { 
       rgb = mapBuffered.getRGB((int) (e.getSceneX()/SCALE_TOTAL), (int)(e.getSceneY()/SCALE_TOTAL)); 
      } 
      else if(mapScroll.getHvalue() >= 0.2 && mapScroll.getHvalue() < 0.4) 
      { 
       rgb = mapBuffered.getRGB((int) (e.getSceneX()/(2/SCALE_TOTAL)), (int) (e.getSceneY()/(2/SCALE_TOTAL))); 
      } 
      else if(mapScroll.getHvalue() >= 0.4 && mapScroll.getHvalue() < 0.6) 
      { 
       rgb = mapBuffered.getRGB((int) (e.getSceneX()/(3/SCALE_TOTAL)), (int) (e.getSceneY()/(3/SCALE_TOTAL))); 
      } 
      else if(mapScroll.getHvalue() >= 0.6 && mapScroll.getHvalue() < 0.8) 
      { 
       rgb = mapBuffered.getRGB((int) (e.getSceneX()/(4/SCALE_TOTAL)), (int) (e.getSceneY()/(4/SCALE_TOTAL))); 
      } 
      else if(mapScroll.getHvalue() >= 0.8 && mapScroll.getHvalue() < 1); 
      { 
       rgb = mapBuffered.getRGB((int) (e.getSceneX()/(5/SCALE_TOTAL)), (int) (e.getSceneY()/(5/SCALE_TOTAL))); 
      } 
      commandOutput.setText(commandOutput.getText() + " \n" + Integer.toString(rgb)); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
      commandOutput.setText(commandOutput.getText() + " \n" + e1.getMessage()); 
     } 
    }); 

스택 추적

javax.imageio.IIOException: Can't read input file! 
at javax.imageio.ImageIO.read(Unknown Source) 
at gameaspects.SourceCodeVersion9.lambda$5(SourceCodeVersion9.java:208) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventFilterRecord.handleCapturingEvent(CompositeEventHandler.java:282) 
at com.sun.javafx.event.CompositeEventHandler.dispatchCapturingEvent(CompositeEventHandler.java:98) 
at com.sun.javafx.event.EventHandlerManager.dispatchCapturingEvent(EventHandlerManager.java:223) 
at com.sun.javafx.event.EventHandlerManager.dispatchCapturingEvent(EventHandlerManager.java:180) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchCapturingEvent(CompositeEventDispatcher.java:43) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:52) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470) 
at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398) 
at javafx.scene.Scene$MouseHandler.process(Scene.java:3766) 
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415) 
at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
at com.sun.glass.ui.View.notifyMouse(View.java:937) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
at java.lang.Thread.run(Unknown Source) 

의 ScrollPane

 Image mapImage = new Image("WorldProvincialMap-v1.01.png"); 
    //Sets the map to full screen 
    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
    int width = gd.getDisplayMode().getWidth(); 
    int height = gd.getDisplayMode().getHeight(); 
    //Creating the gridPane 
    GridPane mapGrid = new GridPane(); 
    //Creating the image views 
    ImageView mapView1 = new ImageView(mapImage); 
    ImageView mapView2 = new ImageView(mapImage); 
    ImageView mapView3 = new ImageView(mapImage); 
    ImageView mapView4 = new ImageView(mapImage); 
    ImageView mapView5 = new ImageView(mapImage); 
    //Fitting the image views to the screen size. 
    mapView1.setFitHeight(height); 
    mapView1.setFitWidth(width); 
    mapView2.setFitHeight(height); 
    mapView2.setFitWidth(width); 
    mapView3.setFitHeight(height); 
    mapView3.setFitWidth(width); 
    mapView4.setFitHeight(height); 
    mapView4.setFitWidth(width); 
    mapView5.setFitHeight(height); 
    mapView5.setFitWidth(width); 
    //Adding the imageViews to the girdPane 
    mapGrid.add(mapView1,0,0); 
    mapGrid.add(mapView2, 1, 0); 
    mapGrid.add(mapView3, 2, 0); 
    mapGrid.add(mapView4, 3, 0); 
    mapGrid.add(mapView5, 4, 0); 
    mapGrid.setManaged(false); 
    mapScroll.setContent(new Group(mapGrid)); 
    mapScroll.setPannable(true); 
    //Removes the ScrollBars 
    mapScroll.setVbarPolicy(ScrollBarPolicy.NEVER); 
    mapScroll.setHbarPolicy(ScrollBarPolicy.NEVER); 

답변

2

에 데이터를로드하는 대신 (210), 당신은 데이터를 얻기 위해 javafx.scene.ImagePixelReader을 사용해야합니다

Image image = ... 
int rgb = image.getPixelReader().getArgb(x, y); 

// remove alpha; is this necessary??? 
rgb = rgb & 0xffffff; 

번 이상 메모리에 이미지를로드하지 않도록이 방법을.

+0

이것은 오류를 제거했지만 내 수식 때문일 수 있지만 클릭 한 위치에서 동일한 Argb가 표시됩니다. 그 공식이 문제가되기 때문에 수정하면 받아 들일 것입니다. –