javafx大图像崩溃 [英] javafx large image crash

查看:325
本文介绍了javafx大图像崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

JavaFX新手

此示例适用于小图片。
但是大图像会使ImageView崩溃。

This example works fine with small images. But a large image crashes ImageView.

我的示例代码是否有缺陷?
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

我下载并处理PDF文件:

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 

这给了我一张5100×6600像素的图像。

This gives me a 5100 × 6600 pixel image.

I尝试查看图像:
几秒钟后会出现一个窗口,其中显示一个空的
滚动窗口以及一个向控制台发出的堆栈跟踪。

I attempt to view the image: After several seconds a window appears with an empty scrollpane and a stacktrace emitted to the console.

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

堆栈跟踪:

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) 


推荐答案

Jira报告了几个错误(您需要注册才能阅读它们):

There are several bugs reported on Jira (you need to be registered to read them):


  • RT-21998 渲染图像时出现NullPointerException

  • RT-22669 渲染大图像时需要处理纹理加载失败的情况

  • RT-22073 如果尺寸大于最大纹理尺寸$,则从快照抛出异常b $ b ...

  • RT-21998 NullPointerException when rendering image
  • RT-22669 Need to handle the case of a failed texture load when rendering large images
  • RT-22073 Exception thrown from snapshot if dimensions are larger than max texture size ...

启用此选项-Dprism.verbose = true以检查您的设置。

Enable this option -Dprism.verbose=true to check your settings.

此外,请遵循此链接 ,有一个选项来设置视频内存。尝试-Dprism.poolstats = true来监控纹理池的实际用法以更好地确定上限,并设置带有该限制的-Dprism.maxvram = XX(XX = 500m,...)

Also, following this link, there's an option to set the video memory. Try "-Dprism.poolstats=true" to monitor the actual usage of the texture pool to better determine the upper limit, and set "-Dprism.maxvram=XX" with that limit (XX=500m, ...)

我没有测试过这个。你可以发布你的图像的链接吗?

I haven't tested this, though. Could you post a link to your image?

这篇关于javafx大图像崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆