服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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

扫描关注微信公众号