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

JSP
我认为JSP有问题(上)
我认为JSP有问题(下)
jsp“抓”网页代码的程序
关于在bean里面打印html的利弊看法
bean里面如何打印到html页面
jdbc3中的RowSet 接口规范
Apusic Application Server1.0中jsp源代码泄漏漏洞
Unify的eWave ServletExec拒绝服务漏洞
通过提交超长的GET请求导致IBM HTTP Server远程溢出
在HTTP请求中添加特殊字符导致暴露JSP源代码文件
Resin 1.2 重要源代码暴露漏洞
多中WEB服务器的通用JSp源代码暴露漏洞
Tomcat 暴露JSP文件内容
IBM WebSphere Application Server 暴露JSP文件内容
JRun 2.3.x 范例文件暴露站点安全信息
BEA WebLogic 暴露源代码漏洞
IBM WebSphere Application Server 3.0.2 存在暴露源代码漏洞
Tomcat 3.1 存在暴露网站路径问题
Sun Java Web Server 能让攻击者远程执行任意命令
Netscape 修复 JAVA 安全漏洞

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-04   浏览: 68 ::
收藏到网摘: 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;
    }
}