中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Web开发 > JSP > Servlets
如何用servlet在客户端生成一个合成图片
作者:未知 时间:2005-07-24 21:22 出处:JR 责编:chinaitpower
              摘要:如何用servlet在客户端生成一个合成图片
如何用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;
    }
}
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有