0

Hello I am attempting to get the rgb of the coordinates of a click within a scrollpane that displays 5 views of an image. The ImageViews are fitted to the screen size while the original image is about 8k by 4k pixels. Below is my attempt to find the rgb however I consistently get a Can't read input file exception despite the fact being that I have used this image before. It is also probably relevant to note the I have a zoom mechanic implemented with the zoom total represented by SCALE_TOTAL

On click code

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

1 Answers1

2

Instead of loading the data to a BufferedImage, you should use the PixelReader for the javafx.scene.Image to get the data:

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

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

This way you avoid loading the image into memory more than once.

fabian
  • 80,457
  • 12
  • 86
  • 114
  • This removed the error, however I am getting the same Argb from where ever I click though this is probably due to my formula. I will accept once I fix the formula since that is probably the problem. – Politic Revolutionnaire Nov 01 '16 at 01:30