`
liuwangxia
  • 浏览: 138465 次
  • 性别: Icon_minigender_1
  • 来自: 黄石
社区版块
存档分类
最新评论

Render a Node to BufferedImage in JavaFX 1.2

阅读更多
In the EffectsPlayground sample in javafx.com, there is a function saveImage(node:Node, file:java.io.File), but it does not work in JavaFX 1.2, because the internal implementation details was changed.

I write a new function that works in JavaFX 1.2:

import com.sun.javafx.geom.Bounds2D;
import com.sun.javafx.geom.AffineTransform;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javafx.scene.*;
import javafx.reflect.*;
import javafx.util.Math;

public function toRenderedImage(node:Node):RenderedImage {
    def context = FXLocal.getContext();
    def nodeClass = FXLocal.getContext().findClass("javafx.scene.Node");
    def getFXNode = nodeClass.getFunction("impl_getPGNode");
    def sgNode = (getFXNode.invoke(context.mirrorOf(node)) as FXLocal.ObjectValue).asObject();
    def getBounds = sgNode.getClass().getMethod("getCompleteBounds", Bounds2D.class, AffineTransform.class);
    def bounds = getBounds.invoke(sgNode, new Bounds2D(), null) as Bounds2D;
    def paintMethod = sgNode.getClass().getMethod("render", Graphics2D.class, Bounds2D.class, AffineTransform.class);
    def img = new BufferedImage(Math.ceil(bounds.getWidth()), Math.ceil(bounds.getHeight()), BufferedImage.TYPE_INT_RGB);
    def g2 = img.createGraphics();
    g2.translate(-bounds.x1, -bounds.y1);
    paintMethod.invoke(sgNode, g2, bounds, new AffineTransform());
    g2.dispose();
    img;
}

public function savePNG(node:Node, os:OutputStream) {
    ImageIO.write(toRenderedImage(node), "png", os);
}

public function savePNG(node:Node, file:File) {
    var savefile;
    if (not file.getName().toLowerCase().endsWith(".png")) {
        savefile = new File(file.getParent(), "{file.getName()}.png");
    } else {
        savefile = file;
    }
    savePNG(node, new FileOutputStream(savefile));
}
分享到:
评论
1 楼 javafxguy 2009-06-19  
这是很有用的一个方法,可以把Node作图后的 画面存下来。

相关推荐

    jsrender-node-starter:用于在服务器上使用JsRender for Node.js模板视图的入门应用程序(带有或不带有Express)

    此样本显示了JsRender Node集成的一些功能,并为使用模板化渲染的自己的Node项目提供了起点。 它还显示了如何将JsRender模板存储在服务器上的文件系统上,然后将它们用于服务器端渲染或客户端渲染,或同时用于两者...

    render in 软件及注册

    安装好原程序,了世哪个汉化文件《Renderin》放到C:\Program Files\Google\Google SketchUp 8\Plugins\Renderin目录下替换原文件,打开SU8在插件下Renderin菜单点License,在弹出的窗口输入号码,点Apply等一会在...

    Unity Offline Render

    It allows you to capture the game view to a multi-channel OpenEXR or multiple PNG files, supporting not just the final output image, but also some common elements, like depth, per-light shadows, ...

    Render to Texture

    "Render to Texture",在OpenGL编程中,是一个高级特性,允许开发者将渲染的结果保存到一个纹理对象中,而不是直接显示到屏幕上。这个过程通常被称为离屏渲染,它为许多复杂的技术提供了基础,如镜像效果、环境映射...

    jquery renderTo属性实现图片放大镜

    在本篇中,我们将深入探讨如何利用jQuery的`renderTo`属性实现图片放大镜效果。 首先,`renderTo`并不是jQuery核心库中的一个直接属性,而是某些基于jQuery的插件所使用的属性,用于指定元素渲染的目标位置。在这个...

    对django中render()与render_to_response()的区别详解

    render()与render_to_response()均是django中用来显示模板页面的,但是在django1.3之后,render()便比render_to_response()更加招人待见!最明显的就是前者会自动使用RequestContext,而后者需要coding进去, 例如:...

    SketchUp插件-室内建筑渲染器插件 Thea Render v3.5.173.1970 + v2.2.1016.1877

    Thea Render是一种基于物理的高质量全局照明渲染器。它是一种独特的渲染器,能够在有偏真实感、无偏和GPU模式下使用最先进的技术进行渲染。在Thea Render中,我们使用最精确的物理模型创建了大量高度真实的材质。...

    Using a Render Pipeline to Render Primitives .zip

    压缩包中的"Using a Render Pipeline to Render Primitives"文件很可能包含了一个简单的示例程序,演示如何使用Metal API从头开始设置渲染管道并渲染一个三角形。 总之,理解并掌握渲染管道的工作原理以及如何使用...

    A Guide to the Project Management Body of Knowledge

    In publishing and making this document available, PMI is not undertaking to render professional or other services for or on behalf of any person or entity, nor is PMI undertaking to perform any duty ...

    The definitive guide to lighting in the High Definition Render

    The definitive guide to lighting in the High Definition Render Pipeline.pdf Unity HDRP设置手册,需要的下载吧

    rendera:Rendera是一个开源绘画包。-开源

    Rendera是一款开源的绘画软件,它的核心特性是提供了一个强大且灵活的创作环境,适合进行照片修饰、制作无缝纹理瓷砖以及其他各种绘画任务。这个软件的独特之处在于它采用C++编程语言,并结合FLTK(Fast Light ...

    使用fbo来实现render to texture演示

    在计算机图形学中,Framebuffer Object(FBO)是OpenGL中的一种技术,用于实现"Render to Texture"(RTT)。RTT允许我们不在屏幕上渲染,而是将渲染结果存储到纹理中,这种纹理可以作为后续渲染步骤的输入。FBO是...

    Django框架中render_to_response()函数的使用方法

    ### Django框架中render_to_response()函数的使用方法 在Django这一流行的Python Web开发框架中,`render_to_response()`函数是处理HTTP请求时一个非常有用的工具。本文将深入探讨`render_to_response()`函数的使用...

    render标签的使用

    在本文中,我们将详细探讨`render`属性在RichFaces 4中的使用,特别是如何利用它来更新页面上的特定区域。 `render`属性通常用于AJAX(异步JavaScript和XML)操作,它允许我们在用户与页面交互时,只更新页面的某些...

    Render React components to Sketch .zip

    "Render React components to Sketch .zip"是一个开源项目,名为"react-sketchapp",它提供了一种将React组件转换为Sketch设计文件的方法。这个项目的核心理念是桥接前端开发与设计的鸿沟,让开发者可以直接利用已有...

    将角色的Animator或Animation去掉,将SkinnedMeshRender更换为一般的Mesh Render,只使用

    • Can be controlled using Mecanim, no need to re-write existing code or controllers, just attach a script. • Supports custom animation events. • Built with performance in mind, minimal CPU ...

    render to texture 事例代码

    "Render to Texture"技术在计算机图形学中是一个重要的概念,主要应用于DirectX 11 (DX11)这样的高级图形编程接口。这项技术允许开发者将渲染的结果存储到纹理贴图中,而不是直接显示在屏幕上。这为游戏开发、实时...

    How To Render

    渲染

    3D-RCNN: Instance-level 3D Object Reconstruction via Render-and-Compare

    to exploit rich supervisory signals in the form of 2D annotations like segmentation, we propose a differentiable Render-and-Compare loss that allows 3D shape and pose to be learned with 2D supervision...

    015_render_to_texture.zip_linux opengl_opengl texture_render to

    在这个“015_render_to_texture.zip”压缩包中,我们聚焦于一个特定的技术:OpenGL中的渲染到纹理(Render To Texture,RTT)。这个技术允许我们将渲染结果直接保存到一个纹理对象中,而非屏幕,这在许多高级图形...

Global site tag (gtag.js) - Google Analytics