GMF中,如何不打开editor保存图片
之前的博客介绍了将当前editor保存为图片的方法。但由于项目里的需求有变,需要在不打开editor的情况下,通过图文件保存图片。由于保存图片的操作必须获得diagram的editpart才能保存,而目前已知的获取editpart的方法只有先打开editor才能获得。那还有其他办法吗?
答案是有的。GMF保存图片对应CopyToImageUtil这个类,这个类里有个方法:copyToImage(Diagram diagram, IPath destination, ImageFileFormat format,IProgressMonitor monitor, PreferencesHint preferencesHint)
,我们可以给这个方法传入Diagram。之后便能通过Diagram保存图片了。
不打开editor保存图片的具体实现如下:
ResourceSet resourceSet = new ResourceSetImpl();
TransactionalEditingDomain.Factory.INSTANCE
.createEditingDomain(resourceSet); // 创建编辑域
URI uri= URI.createFileURI(pathString); // 通过源文件路径创建一个URI
Resource resource = resourceSet.getResource(uri, true); // 通过URI获得对应的资源(内存模型)
Diagram diagram = null;
// 通过resource获取Diagram
for (Object resElt : resource.getContents()) {
if (resElt instanceof Diagram) {
diagram = (Diagram) resElt;
break;
}
}
CopyToImageUtil copyToImageUtil = new CopyToImageUtil();
IPath ipath = new Path("D:\\1.jpg"); // 目标路径
ImageFileFormat imageFormat = ImageFileFormat.resolveImageFormat(3); // 我这里选择的图片格式为jpg
if (diagram != null) {
// 通过diagram保存图片
copyToImageUtil.copyToImage(diagram, ipath,
imageFormat, new NullProgressMonitor(),
XXXDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
}
分析:其实我们在给copyToImage()方法传入diagram的时候,这个方法会先搜索是否存在对应的editor,若存在,则通过这个editor获得diagram的editpart;若不存在,则会根据传入的Diagram,创建对应的editpart(OffscreenEditPartFactory这个类的public DiagramEditPart createDiagramEditPart(Diagram diagram,Shell shell, PreferencesHint preferencesHint方法)。
本质还是通过设法获得EditPart来保存图片。这就是为什么通过传入Diagram能保存图片的原因。