当前位置: 首页 > 图文教程 > 网络编程 > JSP > 如何用servlet在客户端生成一个合成图片

JSP
Servlet及JSP中的多线程同步问题
使用Ant和Tomcat创建Web应用
如何直接在浏览器内运行SQL命令
Servlet、Jsp中的多国语言显示
html与jsp开发分离技术
通过Jsp发送动态图像
Servlets和JSP Pages最佳实践
学习在JSP中使用JavaBeans
JSP显示内容缓存技巧
应用JDOM处理数据库到XML转换的JSP实现
JSP中tomcat的SQL Server2000数据库连接池的配置
用JSTL实现JSP应用程序快速开发
浅谈4种类型的JDBC驱动程序
怎样设置 JSP 的虚拟目录
Java 中对文件的读写操作之比较
javamail在jsp中调用
jsp中任意文字转Unicode的通用模块
JSP与SQL SERVER的留言本
jspSmartUpload上传下载全攻略
Tomcat5.x中的虚拟主机配置方法

JSP 中的 如何用servlet在客户端生成一个合成图片


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-04   浏览: 87 ::
收藏到网摘: n/a

如何用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;
    }
}