imageName不对。。这里好像只取了一个值。。

解决方案 »

  1.   

    用Servlet在客户端合成图片  --------------------------------------------------------------------------------
    转载自:www.javacool.com                   人气:7488  
     
     
    Image I/O 包及对 JDK 的要求 
      如果你的 servlet 要动态生成图象,首先你需要 image I/O,明确的说,你需要生成一图片来响应HTTP请求。核心 Java API 没有直接提供用于保持任何图象的功能。然而,你可以用 Sun 的 Java 1.1 类库来做 image I/O。而且 Sun 的 1.2 版的 image I/O 提供了对 JPEG 图象进行编码和解码的包。因为这些代码在 com.sun 包中,不是核心API的一部分,也不是标准的扩展包,因此,会影响代码的可移植性。 
      使用 jdk 1.2 将比 jdk 1.1 版容易的多,本文介绍 jdk 1.2 下的实现方法。示例有三个步骤:创建、绘制、保存。在本例仅仅示范如何画一个椭圆,当然你可以根据你的需要修改。例子使用了 com.sun.image.codec.jpeg 包生成 JPEG 文件。如果要生成 GIF 文件,你可以使用第三方的包,如 Acme Labs 的 GIF Encoder。 
    1. 使用适当的尺寸创建一个 BufferedImage 对象: 
    BufferedImage 
     image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
    2. 在 image 对象上绘制你想要的图象。假设你想要一个白色的背景,你需要画一个白色填充的矩形。否则背景将是缺省的黑色: 
       Graphics g = image.getGraphics(); 
      g.setColor(Color.white); 
      g.fillRect(0,0, width, height); 
      g.setColor(Color.red); 
      g.drawOval(0, 0, width, height);
    3. 使用 com.sun.image.codec.jpeg 包输出 BufferedImage: 
     response.setContentType("image/jpeg"); 
     ServletOutputStream out = response.getOutputStream();   
     JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 
     encoder.encode(image); 
     out.close(); 案例如下,总共有三个文件
    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;