【发布时间】:2014-12-11 11:52:17
【问题描述】:
我正在尝试在 JavaFX 画布上显示非常大的图像。单张图像的分辨率为 11980x8365。 每个图像都有一个对应的世界文件,我可以使用它来正确定位图像。 我的画布尺寸是 800x600。有时我需要在画布上写下整个图像,有时只是其中的一部分。
这是我到目前为止所做的:
- 将文件中的全尺寸图像加载到 Image 对象中。
- 计算要显示图像的哪个部分并计算比例 参数以将其正确放入 800x600 画布中。
所以基本上我想使用GraphicsContext.drawImage(...) - 将给定图像的当前源矩形绘制到画布的给定目标矩形。
对于这种方法,我正确计算了所有参数。问题是有时 Image 大于 2048x2048,出于某种原因,JavaFX 尝试使用 GPU 将此图像直接绘制到画布上(如果我理解正确的话)。那是我得到异常的时候:
java.lang.NullPointerException
at com.sun.prism.sw.SWGraphics.drawTexture(SWGraphics.java:686) 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.NGCanvas.handleRenderOp(NGCanvas.java:1228)
at com.sun.javafx.sg.prism.NGCanvas.renderStream(NGCanvas.java:997)
at com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:578)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2282)
at com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2176)
at com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2202)
at com.sun.javafx.sg.prism.CacheFilter.impl_renderNodeToCache(CacheFilter.java:655)
at com.sun.javafx.sg.prism.CacheFilter.render(CacheFilter.java:561)
at com.sun.javafx.sg.prism.NGNode.renderCached(NGNode.java:2346)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2034)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2282)
at com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2176)
at com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2202)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2037)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2282)
at com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2176)
at com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2202)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2037)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:225)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:575)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2043)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1951)
at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:469)
at com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:317)
at com.sun.javafx.tk.quantum.UploadingPainter.run(UploadingPainter.java:132)
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:129)
at java.lang.Thread.run(Thread.java:744)
所以我接下来想尝试的是在将图像发送到画布之前在一些临时对象中裁剪和缩放图像。我在任何地方都找不到如何做到这一点的例子。我发现的唯一示例是如何crop Image using WritableImage,但我不知道如何在裁剪后对其进行缩放并将其转换为图像。
【问题讨论】:
标签: image canvas javafx-2 javafx-8