2016-11-01 2 views
0

Bonjour J'essaie d'obtenir la valeur rgb des coordonnées d'un clic dans un panneau de défilement qui affiche 5 vues d'une image. Les ImageView s sont ajustés à la taille de l'écran tandis que l'image originale est d'environ 8k par 4k pixels. Ci-dessous est ma tentative de trouver le RGB mais je reçois systématiquement une exception de fichier d'entrée Can not read malgré le fait que j'ai utilisé cette image avant. Il est sans doute aussi pertinent de noter I ont un mécanicien de zoom mis en œuvre avec le total de zoom représenté par SCALE_TOTALObtention des coordonnées de noeud d'un événement et lecture de RGB à partir de BufferedImage Javafx

Le code de clic

 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()); 
     } 
    }); 

Stack Trace

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); 

Répondre

2

Au lieu de charger les données dans un BufferedImage, vous devez utiliser le PixelReader pour le javafx.scene.Image pour obtenir les données:

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

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

De cette façon, vous éviter de charger l'image en mémoire plus d'une fois.

+0

Cela a supprimé l'erreur, mais je reçois le même Argb d'où je clique même si c'est probablement dû à ma formule. Je vais accepter une fois que je répare la formule puisque c'est probablement le problème. –