zoukankan      html  css  js  c++  java
  • GEF常见问题8:导出到图片

    利用org.eclipse.draw2d.SWTGraphics类和org.eclipse.swt.graphics.ImageLoader类可以实现把画布导出到图片文件的功能,原理是在内存里创建一个空白的Image,然后把Diagram画到它上面,最后保存到指定文件和格式。

    我们可以把导出工作分为两部分,第一部分负责提供要导出的IFigure实例(若要导出整个画布,应从GraphicalViewer获得PRINTABLE_LAYERS,否则会丢失画布上的连线),并负责将得到的图片数据写入文件;第二部分负责IFigure实例到图片数据的转换过程。以下是前者的示例代码:

    String filename = ...;
    PracticeEditor editor = ...;
    ScalableFreeformRootEditPart rootPart = ...;
    IFigure figure = rootPart.getLayer(ScalableFreeformRootEditPart.PRINTABLE_LAYERS);//To ensure every graphical element is included
    byte[] data = createImage(figure, SWT.IMAGE_PNG);
    try {
        FileOutputStream fos = new FileOutputStream(filename);
        fos.write(data);
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    上面代码里调用的createImage()方法是实际在内存里作画并转换为可写入为文件的二进制流的地方,代码如下所示:

    private byte[] createImage(IFigure figure, int format) {
        Rectangle r = figure.getBounds();
        ByteArrayOutputStream result = new ByteArrayOutputStream();
        Image image = null;
        GC gc = null;
        Graphics g = null;
        try {
            image = new Image(null, r.width, r.height);
            gc = new GC(image);
            g = new SWTGraphics(gc);
            g.translate(r.x * -1, r.y * -1);
            figure.paint(g);
            ImageLoader imageLoader = new ImageLoader();
            imageLoader.data = new ImageData[] { image.getImageData() };
            imageLoader.save(result, format);
        } finally {
            if (g != null) {
                g.dispose();
            }
            if (gc != null) {
                gc.dispose();
            }
            if (image != null) {
                image.dispose();
            }
        }
        return result.toByteArray();
    }

    点此下载工程,此工程修改自GEF应用实例中的GefPractice,目标文件的扩展名为.gefpractice不变。


    图1 运行后增加了导出功能按钮

    GEF新闻组里相关链接:
    http://dev.eclipse.org/newslists/news.eclipse.tools.gef/msg05012.html
    http://dev.eclipse.org/newslists/news.eclipse.tools.gef/msg06329.html

  • 相关阅读:
    js高级-闭包
    js作用域
    js执行上下文与执行上下文栈
    js原型及原型链
    去除数组中重复的元素值
    树[省选联考2020]
    GDOI2020 游记
    Problem b[HAOI2011]
    分零食[JSOI2012]
    移动金币「SDOI2019」
  • 原文地址:https://www.cnblogs.com/bjzhanghao/p/838278.html
Copyright © 2011-2022 走看看