GMF:如何在不打开Editor的情况下生成图片
问题
GMF应用中,有时我们希望在不打开*DiagramEditor的情况下,从文件就能生成它的图片
解决方案
首先,从文件中构造DiagramImpl实例:
1 2 3 | TransactionalEditingDomain domain = GMFEditingDomainFactory.getInstance().createEditingDomain(); IFile pageFile = project.getFile( "/diagram/file/path" ); DiagramImpl diagramImpl = DiagramModelLoader.getDiagramFromFile(pageFile, domain); |
然后调用CopyToImageUtil的copyToImageByteArray方法,生成图片的buffer。
1 2 3 4 5 6 7 8 9 | try { CopyToImageUtil copyToImageUtil = new CopyToImageUtil(); byte [] buffer = copyToImageUtil.copyToImageByteArray(diagramImpl, 800 , 800 , ImageFileFormat.PNG, new NullProgressMonitor(),PreferencesHint.USE_DEFAULTS, true ); return buffer; } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); return null ; } |
copyToImageByteArray会先检查该diagramImpl对应的Editor是否已经打开,如果已经打开,则从Editor中生成图片;否则,它会在一个独立的shell中生成一个Editor,然后从它生成图片,这都是在后台进行的。 但它有个问题,或者说是bug:如果已经打开的Editor和diagramImpl对应的文件并不相同,它也会认为Editor已经打开了,那么,生成的图片就牛头不对马嘴了。解决办法是把以上代码改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Shell shell = new Shell(); try { CopyToImageUtil copyToImageUtil = new CopyToImageUtil(); DiagramEditPart diagramEditPart = copyToImageUtil.createDiagramEditPart(pageDescriptor.getDiagram(),shell, PreferencesHint.USE_DEFAULTS); Assert.isNotNull(diagramEditPart); return copyToImageUtil.copyToImageByteArray(diagramEditPart, null , 800 , 800 , ImageFileFormat.PNG, new NullProgressMonitor(), true ); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); return null ; } finally { shell.dispose(); } |
其实以上代码参考了copyToImageByteArray的实现
Binhua Liu原创,写于2013/8/31。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端