jerryjerry123
发贴: 58
积分: 12
|
于 2005-05-15 19:39
如何用servlet在客户端生成一个合成图片 一根麻绳
实际上我们可以在客户端生成一个用graphics画的图 或者也可以在客户端转发一个从服务器取来的图片 但如何集成多个gif,jpg图片生成一个大的图片,同时还有自己画的图就不容易了, 比如: 我上上星期遇到了这个困难,所幸把这个问题解决了。大家都是程序员,各种api我也不用解释了,就把代码贴出来好了,我会在必要的地方加上注释。 总共有三个文件 showImage-------------------------------servlet PdrawInstImage ------------------------服务器端运行的java画图程序 servlet public class showImage extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
try{ String servername = req.getServerName(); String port = ""+req.getServerPort(); WorkflowConnector connector = new WorkflowConnector(); connector.connect("t3://"+servername+":"+port, null, null); String instProcessId = req.getParameter("ipid");
InstProcessInfo instInfo = connector.getAdmin().getInstProcessInfo(instProcessId); ProcessInfo processInfo = connector.getDefinition().getProcess(instInfo.getDefProcessId()); PDrawInstImage imgCreator = new PDrawInstImage(processInfo,instInfo); imgCreator.drawAll(); BufferedImage bufferedImage = imgCreator.getBufferedImage(); res.setContentType("image/jpeg"); //设置返回的文件类型 OutputStream out=res.getOutputStream(); //得到向客户端输出二进制数据的对象 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(bufferedImage); out.close(); } catch(Exception e) //错误处理 { e.printStackTrace(); PrintWriter toClient = res.getWriter(); //得到向客户端输出文本的对象 res.setContentType("text/html;charset=gb2312"); toClient.write("无法打开图片!"); toClient.close(); }
} }
public class PDrawInstImage { /** 图形缓存 */ static BufferedImage bufferedImage; /** 画图接口 */ Graphics2D big; 放在服务器端的java程序 /** * 创建图形缓存。 */ public void creatBufferImage(){ bufferedImage = new BufferedImage((int)jpgDimension.getWidth(),(int)jpgDimension.getHeight(),BufferedImage.TYPE_3BYTE_BGR); big = bufferedImage.createGraphics(); } /** * 返回图形数据缓冲区。 */ public BufferedImage getBufferedImage(){ return this.bufferedImage; } 这个方法里面,采用一个空的frame作为图像观察器,一个MediaTracker作为辅助跟踪,不这么用好象还真不行,具体原因,再看点书,我也许能明白 private void drawTipImage(byte[] bytes){ try{ Frame frame = new Frame(); frame.addNotify(); MediaTracker mt = new MediaTracker(frame);// frame acts as an ImageObserver Image image = Toolkit.getDefaultToolkit().createImage(bytes); mt.addImage(image, 0); mt.waitForAll(); int tipW = image.getWidth(frame); int tipH = image.getHeight(frame); int xx = X +(WIDTH - tipW)/2; int yy = Y +(HEIGHT- tipH)/2; big.drawImage(image,xx,yy,frame); }catch(Exception e){ e.printStackTrace(); } } private void drawShape(){ int minorType = activityInfo.getMinorType(); drawTipImage(ImageFactory.getImageData(minorType)); } public static byte[] getImageData(int minorType){ byte[] bytes = null; try { URL iconURL = getResource(getActivityName(minorType)); if(iconURL != null) { InputStream is = iconURL.openStream(); int avail = is.available(); bytes = new byte[avail]; is.read(bytes,0,avail); } } catch(Exception e) { e.printStackTrace(); } return bytes; } 特别强调,image实际上可以直接通过 Image image = Toolkit.getDefaultToolkit().getImage( display.imageFile); 这种方式获得,然而我在实际运行中,却一直得不到图片,我想,java在这块实行了“惰性机制”,画图是要到真画时才加载,又不支持非本地调用,所以通过servlet就无法调用到图片资源,具体细节我还是不太清楚,但不管怎么说的换一种方式,所以我们用下面的方法,先在本地服务器获取图片的数组信息,然后把他组装成图片。 这个方法主要是用来 public byte[] getImageData(int minorType){ byte[] bytes = null; try { URL iconURL = getResource(getActivityName(minorType)); if(iconURL != null) { InputStream is = iconURL.openStream(); int avail = is.available(); bytes = new byte[avail]; is.read(bytes,0,avail); } } catch(Exception e) { e.printStackTrace(); } return bytes; } }
|