import Java.awt.Dimension;
import Java.awt.Graphics2D;
import Java.awt.geom.Rectangle2D;
import Java.awt.image.BufferedImage;
import Java.io.OutputStream;
import Java.io.StringReader;
import Java.util.Iterator;
import javax.servlet.http.HttpServletResponse;
import javax.vecmath.Point2d;
import org.apache.log4j.Logger;
import org.openscience.cdk.Molecule;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.io.MDLReader;
import org.openscience.cdk.layout.StructureDiagramGenerator;
import org.openscience.cdk.renderer.Renderer2DModel;
import org.openscience.cdk.renderer.SimpleRenderer2D;
public class ImageTypeExporterUtil {
private static final Logger logger = Logger.getLogger(ImageTypeExporterUtil.class);
/**
* show molecule structure to image type (png, jpeg)
*
* @param mol String molecule stucture
* @param length width and height
* @param response HttpServletResponse object
* @throws Exception
* if occurred exception ,then throw Exception
*/
public static void showAsImage(String stucture, Integer length, HttpServletResponse response) throws Exception {
logger.debug("ImageTypeExporterUtil.showAsImage..");
StringReader mdl = new StringReader(stucture);
MDLReader cdkMDL = new MDLReader(mdl);
Molecule mol = new Molecule();
cdkMDL.read(mol);
// null coordinates
Iterator<IAtom> itatoms = mol.atoms();
while (itatoms.hasNext()) {
IAtom atom = itatoms.next();
atom.setPoint2d(null);
atom.setPoint3d(null);
}
// generate 2D coordinates
StructureDiagramGenerator sdg = new StructureDiagramGenerator();
sdg.setMolecule(mol);
try {
sdg.generateCoordinates();
} catch (Exception ex) {
ex.printStackTrace();
}
IMolecule layedOutMol = sdg.getMolecule();
// scale molecule
final double UNDEF_POS = 100000;
double minX = UNDEF_POS, minY = UNDEF_POS, maxX = UNDEF_POS, maxY = UNDEF_POS;
itatoms = layedOutMol.atoms();
while (itatoms.hasNext()) {
IAtom atom = itatoms.next();
Point2d point2d = atom.getPoint2d();
if (minX == UNDEF_POS || minX > point2d.x)
minX = point2d.x;
if (minY == UNDEF_POS || minY > point2d.y)
minY = point2d.y;
if (maxX == UNDEF_POS || maxX < point2d.x)
maxX = point2d.x;
if (maxY == UNDEF_POS || maxY < point2d.y)
maxY = point2d.y;
}
double scaleX = length / (maxX - minX + 1);
double scaleY = length / (maxY - minY + 1);
double scale = scaleX > scaleY ? scaleY : scaleX;
double centreX = scale * (maxX + minX) / 2.;
double centreY = scale * (maxY + minY) / 2.;
double offsetX = length / 2. - centreX;
double offsetY = length / 2. - centreY;
itatoms = layedOutMol.atoms();
while (itatoms.hasNext()) {
IAtom atom = itatoms.next();
Point2d a = atom.getPoint2d();
Point2d b = new Point2d();
b.x = a.x * scale + offsetX;
b.y = a.y * scale + offsetY;
atom.setPoint2d(b);
}
// set rendering properties
Renderer2DModel r2dm = new Renderer2DModel();
r2dm.setDrawNumbers(false);
r2dm.setUseAntiAliasing(true);
r2dm.setColorAtomsByType(true);
r2dm.setShowAtomTypeNames(false);
r2dm.setShowAromaticity(true);
r2dm.setShowImplicitHydrogens(false);
r2dm.setShowReactionBoxes(false);
r2dm.setKekuleStructure(false);
Dimension dim = new Dimension();
dim.setSize(length, length);
r2dm.setBackgroundDimension(dim);
r2dm.setBackColor(java.awt.Color.WHITE);
// render the image
SimpleRenderer2D renderer = new SimpleRenderer2D();
renderer.setRenderer2DModel(r2dm);
BufferedImage bufferedImage = new BufferedImage(length, length,
BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = bufferedImage.createGraphics();
graphics.setPaint(java.awt.Color.WHITE);
Rectangle2D.Float rectangle = new Rectangle2D.Float(0, 0, length, length);
graphics.fill(rectangle);
renderer.paintMolecule(layedOutMol, graphics);
// write the image to response
response.setContentType("image/png");
OutputStream out = response.getOutputStream();
try {
javax.imageio.ImageIO.write(bufferedImage, "png", out);
} finally {
out.close();
}
}
}
posted on 2009-10-22 08:51
周锐 阅读(752)
评论(0) 编辑 收藏 所属分类:
Chemistry 、
Java 、
CDK