Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

JavaFX large image crashes ImageView

375 views
Skip to first unread message

Jeff Higgins

unread,
Jan 7, 2015, 8:34:28 PM1/7/15
to
New to JavaFX.
Is my example code flawed?
Is there a problem with large images in JavaFX?
Something else?

I grab an example from the web:
<http://www.java2s.com/Code/Java/JavaFX/JavaFXImageZoomExample.htm>

I download and process a PDF file:
<http://optics.byu.edu/BYUOpticsBook_2013.pdf>

gs -sDEVICE=png16m -dNOPAUSE -dBATCH -dSAFER \
-r600 -dFirstPage=1 -dLastPage=1 \
-sOutputFile=001.png BYUOpticsBook_2013.pdf

This gives me a 5100 × 6600 pixel image.

I attempt to view the image:

import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.ScrollEvent;
import javafx.stage.Stage;

/**
*
* @author O.J. Sousa Rodrigues (office at halbgasse.at)
*/
public class ZoomExample extends Application {

private ImageView imageView = new ImageView();
private ScrollPane scrollPane = new ScrollPane();
final DoubleProperty zoomProperty = new SimpleDoubleProperty(200);

@Override
public void start(Stage stage) throws Exception {

zoomProperty.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable arg0) {
imageView.setFitWidth(zoomProperty.get() * 4);
imageView.setFitHeight(zoomProperty.get() * 3);
}
});

scrollPane.addEventFilter(ScrollEvent.ANY,
new EventHandler<ScrollEvent>() {

@Override
public void handle(ScrollEvent event) {
if (event.getDeltaY() > 0) {
zoomProperty.set(zoomProperty.get() * 1.1);
} else if (event.getDeltaY() < 0) {
zoomProperty.set(zoomProperty.get() / 1.1);
}
}
});

imageView.setImage(new Image("file:///home/jeff/001.png"));
imageView.preserveRatioProperty().set(true);
scrollPane.setContent(imageView);

stage.setScene(new Scene(scrollPane, 400, 300));
stage.show();

}
public static void main(String[] args) {
launch(args);
}
}

I get stack trace:

java.lang.NullPointerException
at com.sun.prism.sw.SWGraphics.drawTexture(SWGraphics.java:686)
at com.sun.prism.sw.SWGraphics.drawTexture(SWGraphics.java:665)
at com.sun.prism.sw.SWGraphics.drawTexture(SWGraphics.java:648)
at com.sun.javafx.sg.prism.NGImageView.renderContent(NGImageView.java:123)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2067)
at com.sun.javafx.sg.prism.NGImageView.doRender(NGImageView.java:103)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2067)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2308)
at com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2202)
at com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2228)
at
com.sun.javafx.sg.prism.CacheFilter.impl_renderNodeToCache(CacheFilter.java:663)
at com.sun.javafx.sg.prism.CacheFilter.render(CacheFilter.java:567)
at com.sun.javafx.sg.prism.NGNode.renderCached(NGNode.java:2372)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2058)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2067)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1959)
at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:474)
at com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:327)
at com.sun.javafx.tk.quantum.UploadingPainter.run(UploadingPainter.java:135)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at
com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.lang.Thread.run(Thread.java:745)

But this works:
I just can't see the image because no scroll, etc.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class LoadImage extends Application {

public static void main(String[] args) {
Application.launch(args);
}

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Load Image");

StackPane sp = new StackPane();
Image img = new Image("file:///home/jeff/001.jpg");
ImageView imgView = new ImageView(img);
sp.getChildren().add(imgView);

Scene scene = new Scene(sp);
primaryStage.setScene(scene);
primaryStage.show();
}
}

Knute Johnson

unread,
Jan 7, 2015, 9:26:07 PM1/7/15
to
I didn't use your image, I used a large JPEG I had (4128x2322). The
program compiled but when I ran it, it took several seconds to open the
window and had no image and no scrollpane. No errors either. I'm
barely JavaFX literate but I don't know what your problem is.

Jeff Higgins

unread,
Jan 7, 2015, 9:30:14 PM1/7/15
to
On 01/07/2015 09:26 PM, Knute Johnson wrote:

> I didn't use your image, I used a large JPEG I had (4128x2322). The
> program compiled but when I ran it, it took several seconds to open the
> window and had no image and no scrollpane. No errors either. I'm
> barely JavaFX literate but I don't know what your problem is.
>
I got the scrollbars - along with the stacktrace and no image.
Thanks for the confirmation.

Jeff Higgins

unread,
Jan 8, 2015, 8:21:31 PM1/8/15
to
On 01/07/2015 08:32 PM, Jeff Higgins wrote:
> New to JavaFX.
> Is my example code flawed?
Shrugs.
> Is there a problem with large images in JavaFX?
Perhaps, see below.
> Something else?
Perhaps, see below.

In an answer at stackoverflow a certain José Pereda
helpfully pointed me to some resources.
<http://stackoverflow.com/questions/27840362/javafx-large-image-crash>

Perhaps there are problems with large images in JavaFX.
Perhaps my hardware is not up to the task.
Using the -Dprism.verbose=true switch, I see that I'm not able to use
hardware acceleration.

Do I really need all that?
I'm able to wrangle that image and more in Swing and SWT!

Prism pipeline name = com.sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2
succeeded.
GLFactory using com.sun.prism.es2.X11GLFactory
(X) Got class = class com.sun.prism.es2.ES2Pipeline
Failed Graphics Hardware Qualifier check.
System GPU doesn't meet the es2 pipe requirement
Prism pipeline name = com.sun.prism.sw.SWPipeline

GraphicsPipeline.createPipeline: error initializing pipeline
com.sun.prism.es2.ES2Pipeline
*** Fallback to Prism SW pipeline

It's all too bad. I have a nice little Swing image annotation
application that I think would benefit from the JavaFX
scenegraph rather that my little homemade one but now it seems
I'll be unable to try it.

Boo hoo.



0 new messages