2008年1月8日星期二

GEF:导出到图片

GEF中编辑好图片后,如何保存成图片呢?

以下是Action的代码:

private class ExportImageAction extends Action {

private final Log log = LogFactory.getLog(getClass());

/**
* Constructor
*/
public ExportImageAction() {
setText("导出图片到本地");
setHoverImageDescriptor(ImagesContext
.getImageDescriptor(ImagesContext.SAVE));
}

@Override
public void run() {
FileDialog dialog = new FileDialog(Util.getShell(), SWT.SAVE);
dialog.setFilterNames(new String[] { "PNG(*.png)" });
dialog.setFilterExtensions(new String[] { "*.png", "*.*" });
String fileName = dialog.open();
DiagramEditor editor = (DiagramEditor) getPage().getActiveEditor();
RootEditPart rootPart = editor.getViewer().getRootEditPart();
IFigure figure = ((ScalableRootEditPart) rootPart)
.getLayer(ScalableRootEditPart.PRINTABLE_LAYERS);
byte[] data = createImage(figure, SWT.IMAGE_PNG);
try {
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(data);
fos.close();
MessageDialog.openInformation(editor.getSite().getShell(),
"导出", "图形已经导出到 " + fileName);
} catch (IOException e) {
log.warn("导出图片出错", e.fillInStackTrace());
}
}

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();
}

}

没有评论:

发表评论