imageName不对。。这里好像只取了一个值。。
解决方案 »
- jquery easyui datagrid中使用combotree
- 自定义windows.confirm, 实现同样功能?
- tomcat 连接池的配置
- 全国高薪聘请赴韩工程师
- JSP老手帮我看看这页代码,为什么表单和里面的内容显示不出来?
- 哪位大虾知道在TOMCAT 5。0 中设置虚拟目录??
- 小妹不才,想问个 javascript 的小问题! 急死人了!!!
- 一道HTML的题,求解?
- throw new ServletException(e.toString()); 这行出现了问题。
- 各位仁兄,谁有MasteringJavabeans的例子程序源码?
- 谁给一个写得比较好的异常处理类,能够方便得到调试信息,方便告知用户错误原因
- (急。。)请问jreport??在一列中,相邻的行能否合并。(在线等待,立马给分100)
转载自: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;
}
}