作者:陈先波(turbochen@163.com)
日期:2004/7/24
来源:www.JavaGarden.net
本文将就如何输出图形到web,包括将数据库中的图形输出到web、如何制作缩略图、自绘图形等方面来介绍服务器端的图形编程。
我们先从最简单的开始. 在服务器端画图不像在客户端程序里,可以提供JFrame或JPane来作为画布作图。对于服务器端,访问者是通过浏览器来访问服务器,服务器上显示的JFrame用户是看不到的。
好在Java为我们提供了BufferedImage类,可以让我们在内存中画图。画完图将其送到web端显示就行了。
// 图形大小 int width=400,height=400; // 建立内存图像 BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); // 从图像中取得图形对象 Graphics g = image.getGraphics();
从上面的代码可以建立一个内存图像,并从中取得Graphics对象。我们知道,所有的图形都是以Graphics对象来绘制的。例如,画一个方框的代码如下:
// 在坐标为(10,10)的位置画一个大小为100*20大小的方框, g.drawRect(10,10,100,20);
具体Graphics类的用法,请参考相关书籍。在此不作介绍了。
图形绘制好后,下一步就是将图形输出到web。
// 将ContentType设为"image/jpeg", 以让浏览器识别图像格式。 response.setContentType("image/jpeg"); // 建立JPEG图像编码器,将BufferedImage编码成jpeg格式输出到response的输出流。 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream()); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image); param.setQuality(1.0F, true); encoder.encode(image, param);
在jdk1.4开始,引入了一个新的imageio库,提供了一个新的工具类ImageIO来进行图像的输出和输出操作。使用ImageIO进行图像的输出操作,可使代码更加简洁,如下:
// 关闭缓存(缺省情况下是开启的)。在实际应用中我们发现, // 如果不关闭缓存,在IE5.5上可能无法正常运行本程序。 // 而IE5.0和IE6.0则不会有问题。 ImageIO.setUseCache(false); // 将图像以jps格式写入到输出流。 ImageIO.write(image, "jpg", response.getOutputStream());
OK, 至此,我们绘制的图形就可以显示在客户端的浏览器上了。以下是演示程序输出的效果图:
完整的jsp演示程序,请点击下载。
一般我们将图片以二进制格式存在数据库中。借助ImageIO的read方法,我们可以直接将数据库中的图片生成BufferedImage.
// 这里我们假设在数据库表tabimage中有一个myimage字段存放有图片。PreparedStatement ps = conn.prepareStatement("SELECT myimage FROM tblimage WHERE id=119");ResultSet rs = ps.executeQuery();InputStream data = null;if (rs.next()) { // 取得图片的输入流 data = rs.getBinaryStream("signet");}rs.close();ps.close();if (data == null) {conn.close();return null;}ImageIO.setUseCache(false);// 将图片读入到BufferedImage对象中。BufferedImage image = ImageIO.read(data);conn.close();// 取得图像的graphics对象,Graphics graphics = image.createGraphics()// 通过graphics对象在图片上写上文字graphics.drawString("Hello World!",10,10);
余下的代码就是将图像输出,请参考前面的例子。由于这个例子涉及到数据库的操作,无法给出完整的例子。
在很多在线购物的网站,通常将商品的介绍图片以缩略图的形式显示在商品目录清单中,用户点击缩略图后再弹出商品的详细内容及原始图片。
所谓缩略图就是将原图以一定比例缩小。同样,借助ImageIO, 我们先从数据库(或文件)读入一个图片(参考上面的例子),
// 读入原始图的image对象 BufferedImage src = ImageIO.read(inputstream); // 得到原图的宽度和高度 int wideth=src.getWidth(); int height=src.getHeight(); // 生成原图1/2大小的内存图像,你也可以指定固定大小 BufferedImage taget = new BufferedImage(wideth/2,height/2,BufferedImage.TYPE_INT_RGB); // 将原图绘制在缩小后的内存图像上 taget.getGraphics().drawImage(src,0,0,wideth/2,height/2,null); 剩下的工作就是输出缩略图了,在此不再累述。
更多相关内容,请访问JavaGarden.net
发表于 @ 2004年07月26日 10:41:00|评论(loading...)|编辑