新闻资讯

新闻资讯

实时气象信息

气象信息

今日明日油价

明日油价

航班起降信息

航班信息

TTC动态时刻表

TTC时刻表

超市特价信息

超市特价

商场特价信息

商场特价

中外食谱

中外食谱

技术IT

技术IT

中外名画

中外名画

超强游戏

超强游戏

幽默笑话

幽默笑话

漫画卡通

漫画卡通


使用Java Servlet动态生成图片

主编发表于2010年3月14日 · 发表评论
归档于: Java, 技术IT 

  在Web应用中,经常需要动态生成图片,比如实时股市行情,各种统计图等等,这种情况下,图片只能在服务器内存中动态生成并发送给用户,然后在浏览器中显示出来。

  本质上,浏览器向服务器请求静态图片如jpeg时,服务器返回的仍然是标准的http响应,只不过http头的contentType不是text/html,而是image/jpeg而已,因此,我们在Servlet中只要设置好contentType,然后发送图像的数据流,浏览器就能正确解析并显示出图片。

  在Java中,java.awt和java.awt.image包提供了基本的绘制图像的能力,我们可以在内存中绘制好需要的图形,然后编码成jpeg或其他图像格式,最后发送相应给浏览器即可。下面是使用Servlet动态创建图像的详细步骤:

  1.创建BufferedImage对象,该对象存在内存中,负责保存绘制的图像;

  2.创建Graphics2D对象,该对象负责绘制所需的图像;

  3.当绘制完成后,调用com.sun.image.codec.jpeg包的JPEG编码器对其编码;

  4.最后将编码后的数据输出至HttpResponse即可。

  注意com.sun.image.codec.jpeg包位于JDK目录的rt.jar包中,它不是公开的API,需要将rt.jar复制到web应用程序的WEB-INF/lib下。

  我们先创建一个最简单的Servlet:

<table borderColor=#ffcc66 width=”90%” align=center bgColor=#dadacf border=1>

<tr>

<td>public class CreateImageServlet extends HttpServlet {
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {
  response.setContentType(”image/jpeg”);
 }
}</td></tr>

</table>
  我们首先设置了response的contentType为image/jpeg,这样浏览器就可以正确识别。

  然后,创建一个大小为100×100的BufferedImage对象,准备绘图:

<table borderColor=#ffcc66 width=”90%” align=center bgColor=#dadacf border=1>

<tr>

<td>int width = 100;
int height = 100;
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);</td></tr>

</table>
  接着,BufferedImage对象中获取Graphics2D对象并绘图:

<table borderColor=#ffcc66 width=”90%” align=center bgColor=#dadacf border=1>

<tr>

<td>Graphics2D g = bi.createGraphics(); // 创建Graphics2D对象
// 填充背景为白色:
g.setBackground(Color.BLUE);
g.clearRect(0, 0, width, height);
// 设置前景色:
g.setColor(Color.RED);
// 开始绘图:
g.drawLine(0, 0, 99, 99); // 绘制一条直线
// 绘图完成,释放资源:
g.dispose();
bi.flush();</td></tr>

</table>
  然后,对BufferedImage进行JPEG编码:

<table borderColor=#ffcc66 width=”90%” align=center bgColor=#dadacf border=1>

<tr>

<td>JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(1.0f, false);
encoder.setJPEGEncodeParam(param);
try {
 encoder.encode(bi);
}
catch(IOException ioe) {
 ioe.printStackTrace();
}</td></tr>

</table>
  编码后的JPEG图像直接输出到了out对象中,我们只要传入response. getOutputStream()就可以直接输出到HttpResponse中。

  下面是完整的代码:

<table borderColor=#ffcc66 width=”90%” align=center bgColor=#dadacf border=1>

<tr>

<td>package com.crackj2ee.web.util;

import java.io.*;
import java.awt.*;
import java.awt.image.*;

import javax.servlet.*;
import javax.servlet.http.*;

import com.sun.image.codec.jpeg.*;

/**
* @author Liao Xue Feng
*/
public class CreateImageServlet extends HttpServlet {

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {
  response.setContentType(”image/jpeg”);
  createImage(response.getOutputStream());
 }

 private void createImage(OutputStream out) {
  int width = 100;
  int height = 100;
  BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  Graphics2D g = bi.createGraphics();
  // set background:
  g.setBackground(Color.BLUE);
  g.clearRect(0, 0, width, height);
  // set fore color:
  g.setColor(Color.RED);
  // start draw:
  g.drawLine(0, 0, 99, 199);
  // end draw:
  g.dispose();
  bi.flush();
  // encode:
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
  JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
  param.setQuality(1.0f, false);
  encoder.setJPEGEncodeParam(param);
  try {
   encoder.encode(bi);
  }
  catch(IOException ioe) {
   ioe.printStackTrace();
  }
 }
}</td></tr>

</table>
  最后将这个Servlet编译,注册到web.xml中,映射路径为/CreateImage,写一个简单的index.html测试:

<table borderColor=#ffcc66 width=”90%” align=center bgColor=#dadacf border=1>

<tr>

<td><html><head></head>
<body>
<img src=”CreateImage”>
</body></html></td></tr>

</table>
  如能正确显示,大功告成!


本文所属类别其他文章

技术IT:

♦ Google林斌:HTML5将颠覆Web应用
♦ IBM安全报告被Google友情纠正数据
♦ 微软必应吸引玩家 推《魔兽世界》搜索
♦ SYBASE ASE 15.5六大新特性揭秘
♦ IBM世博会上实践“智慧的城市”
♦ IBM:有一双发现用户的眼睛
♦ 开源技术的未来--多领域迎接突破
♦ 浅析SQL Server中如何使用CLR调用.NET
♦ eWeek:亚马逊对谷歌形成挑战的十大原因
♦ 嵌入式开发 硬件软件何者更重要?
♦ 新广告推出 IBM在10月7日有大动作?
♦ 谷歌收购背后:游戏是饵 意在移动互联网
♦ 如何查找SQL Server自增ID不连续记录?
♦ 如何在WordPress的wp-admin界面只显示登录用户的文章?
♦ ASP.NET页面刷新数据重复提交解决方案
♦ 10个非技术人员无法理解的软件概念
♦ 纽约时报:谷歌和甲骨文的开源战争
♦ IBM:智慧信息架构“从无到有”五步论
♦ 编程语言的发展趋势:声明式动态并发
♦ “行”“列”对比 Sybase IQ酷在哪里?
♦ 红帽任命美军退役上将为董事会主席
♦ 博看文思谢伟:基于iPhone应用开发实践
♦ 马万铮:手机网络Android应用开发实践
♦ 刘斌:百度单机及分布式数据库应用实践
♦ 胡研:移动应用软件统一化模型研究设计
♦ 2010 SACC王宝:架构没有最好只有最合适
♦ 巧妙SQL Server设置 备份状态邮件通知
♦ 2010 SACC会场 惊现最小的系统架构师
♦ 细数Infobright的相关数据类型
♦ 自动以管理员身份运行.NET程序详解
♦ 达梦数据库参加第三届中国软件渠道大会
♦ 系统架构师大会开幕 总编分享云报告
♦ 胡研:构建服务于开发商的统一化模型
♦ 马万铮:移动互联网常见问题及解决方法
♦ 移动互联网未来趋势是贴近和还原
♦ 谢伟:做iPhone开发需要发挥个人想象力
♦ 博看文思谢伟:基于iPhone应用开发实践
♦ 马万铮:手机网络Android应用开发实践
♦ 刘斌:百度单机及分布式数据库应用实践
♦ 胡研:移动应用软件统一化模型研究设计
♦ 2010 SACC王宝:架构没有最好只有最合适
♦ 巧妙SQL Server设置 备份状态邮件通知
♦ 2010 SACC会场 惊现最小的系统架构师
♦ 细数Infobright的相关数据类型
♦ 自动以管理员身份运行.NET程序详解
♦ 达梦数据库参加第三届中国软件渠道大会
♦ 系统架构师大会开幕 总编分享云报告
♦ 梁建锋:海量用户游戏框架构思与实践
♦ SQL Server 2008数据库复制且同步备份
♦ 徐超:F5云计算应用交付平台新方案
♦ 调查结果:Android用户更愿意点击广告
♦ Android平台动力不断
♦ ASP.NET MVC路由匹配检测组件方法解析
♦ 张旭:基于大规模集群的运维架构设计
♦ 蔡文胜谈3G门户:Symbian应用应放弃
♦ 中国农业发展银行缘何青睐DB2
♦ Oracle与Google两巨头战争冲击整个硅谷
♦ Adobe更新Web版Photoshop 用户无需注册
♦ 谈谈最近的Oracle与Google之争
♦ 升级成本高 甲骨文遭老客户抛弃的启示
♦ 2010架构师大会 讲师全部来自技术一线
♦ 程序员要有与时俱进的思想意识
♦ 诺基亚命系QT 而非Symbian、Meego
♦ 走进国内顶级Android论坛:机锋网
♦ 《Android平台开发之旅》作者谈Android
♦ 数据挖掘之Intelligent Miner
♦ Silverlight的Action特性应用实例解读
♦ IBM Intelligent Miner解决方案
♦ IBM DB2商业智能在电信行业的成功应用
♦ IBM应对汽车系统的复杂性
♦ IBM嵌入式系统案例
♦ IBM Rational软件介绍
♦ IBM助搜狐构建灵活稳健的内部信息门户
♦ DataStage为ETL过程提供了图形化界面
♦ 数据库中内连接、全连接与左右连接详解
♦ Silverlight自定义控件模板如何管理?
♦ 微软透漏WP7开发路线图 欧洲将最先上市
♦ 微软云首落东莞 低成本剑指中国市场
♦ 开源RBAC产品的利与弊
♦ 谷歌CEO谈未来Android平台的发展
♦ IBM与微软合作:硬软件or软硬件?
♦ IBM中端市场合作战略获成功 将长期执行
♦ 解读微软裁员5000:大象为何急需改变?
♦ Meego时机欠佳 Android不是下一个Linux
♦ Jazz协作支持:下一个发展方向
♦ IBM Jazz统一协同让开发不再孤单
♦ 提高创新力 IBM助力中国银行业智慧转型
♦ Windows Phone 7:真的“不同”了吗?
♦ 基于Silverlight-Caliburn框架六大特性
♦ SQL Server安全管理 恶意攻击自不量力
♦ 微软.NET企业级架构解决方案:业务层
♦ GeForce GT 430将会数周内上市?
♦ 达梦成功中标温州人口信息综合管理系统
♦ 大公司是如何走上开源之路的
♦ 应深入学习的10个Android开源应用项目
♦ 2010年JavaOne大会将于9月举行
♦ 五大免费/开源NAS项目
♦ 微软携手CSIP 提升Dynamics产品操控力
♦ 盘点:最具影响的十大IT收购
♦ 2010系统架构师大会增添移动专场
♦ 梅孝龙:Android平台问题究竟在哪里?
♦ SQL Azure架构分析概述
♦ 谈毅:如何看待Android版本混乱问题
♦ 评论:手机游戏的出路在哪里?
♦ 浅析SQL Server如何链接远程MySQL
♦ VS LightSwitch初体验 定位非专业人员
♦ 谈毅:谷歌统一不了Android3.0的UI界面
♦ MIT为Android智能手机增超级计算能力
♦ 25个令人惊奇的CSS3实验和例子
♦ Ubuntu放弃支持Intel IA64安腾架构
♦ 5件Java性能监控小技巧:应对编程困难
♦ 外媒评论:我的丈夫是个程序员
♦ 大牛对话:万维网已死?
♦ IBM云计算助全球首个3D互联网开发平台
♦ 诺基亚与Android:谁更能抓住用户?
♦ 华为接受印度安全新规提供源代码
♦ 专访微软CIO:Google苹果挑战不足为惧
♦ Linux发行版流行趋势图
♦ 诺基亚收购手机应用分析公司Motally
♦ iPad能否给联通带来一次新机会?
♦ 微软发布SSMA 支持数据库迁移SQL Azure
♦ 越久就越臃肿 Symbian理应速速安乐死
♦ 中国CPU和基础软件90%以上依赖进口
♦ 英特尔宣布将以78.6亿美元收购McAfee
♦ 甲骨文起诉谷歌 微软得渔翁之利
♦ iPhone 4难成中国联通“救命稻草”
♦ 敏捷进行时——专访Scott W. Ambler
♦ PostgreSQL权限提升和拒绝服务漏洞
♦ SQL Azure新特性之数据大容量
♦ 大盘点:2010中国互联网大会十大精彩
♦ Silverlight多项目共享DLL文件方法讨论
♦ 关于ASP.NET MVC表单设计器的简单思路
♦ 英特尔斥巨资收购McAfee 进军软件领域
♦ 阿里巴巴证实其B2B技术部总监溺水身亡
♦ 微软MSN发布深度智能手机BuddyPhone
♦ 微软发布SSMA 支持数据库迁移SQL Azure
♦ 越久就越臃肿 Symbian理应速速安乐死
♦ 中国CPU和基础软件90%以上依赖进口
♦ 英特尔宣布将以78.6亿美元收购McAfee
♦ 甲骨文起诉谷歌 微软得渔翁之利
♦ iPhone 4难成中国联通“救命稻草”
♦ 敏捷进行时——专访Scott W. Ambler
♦ PostgreSQL权限提升和拒绝服务漏洞
♦ 《连线》杂志:Web已死 互联网永生
♦ Ovi减免费用:智能手机回归硬件之争?
♦ 十年程序员 何去何从
♦ 姜饼之后是蜂窝 Android新版本名称曝光
♦ IBM在华推出一体式电子心电图管理系统
♦ 传统应用软件:Android背后的支柱
♦ 详解SQL Azure与SQL Server共性与差异
♦ Oracle 起诉谷歌背后 隐藏的是什么?
♦ 软件从敏捷到超精益开发的10步
♦ 厂商和运营商表态:Android 3.0被误读
♦ IBM XIV助华南电信构建超级邮件系统
♦ Android2.2特性将程序装到卡上是骗局?
♦ 发展有限导致Facebook早期员工大量离职
♦ 兴趣与坚持:程序员从初级到中级
♦ 盘点微软平台上的六大NoSQL数据库
♦ Hunch:Flickr创始人又一个Web2.0奇迹
♦ 苹果主导手机广告市场 Android增长迅猛
♦ 澳统计局将采用IBM软件提高员工协作
♦ iPad不足颇多,Android平板还有机会
♦ 甲骨文PK谷歌背后:开源软件走向何方
♦ IBM助力省农信社数据集中项目
♦ LG公司看好WP7全面超越Android平台
♦ 诺基亚或3年内将MeeGo降至中低端级别
♦ 惊人发现!C#亲Java远离C++
♦ Meego还不是Nokia的那颗救命稻草
♦ IBM的PBC——通透的绩效管理文化
♦ 借助Android平台 探寻谷歌的求索革命
♦ SQL Server配置全攻略 打造SQL最佳性能
♦ 十年的演变:Linux安全的过去与现在
♦ 前瞻:Solaris 11将会带给我们些什么?
♦ VS LightSwitch能否敲开非程序员心门?
♦ 甲骨文告Google侵权一事 令硅谷震惊
♦ Mocha BSM 7.5.0发布 进入“睿智”时代
♦ 浅谈F# 2.0面向.NET Framework运行时
♦ 盘点云时代十大先驱厂商 IBM将登云巅峰
♦ 甲骨文与开源决裂?OpenSolaris被扼杀
♦ 打保密战 甲骨文弃开源项目OpenSolaris
♦ NVIDIA高层称公司未来寄希望于Android
♦ 资深系统管理员给Linux/Unix新人的建议
♦ IBM刀片创新成果推动blade.org生根中国
♦ 预计Windows Phone 7有匹敌Android潜力
♦ 24款让人欲罢不能的免费Linux游戏
♦ Java之父:Java较安全 Solaris前景堪忧
♦ 诺基亚Q2市场份额下降最多 HTC上升最快
♦ 是否应该允许开发人员进入生产环境?
♦ Oracle BPM 11g:让业务人员主导开发
♦ SAP推价值工程计划 帮客户持续产生价值
♦ 常用Java Profiling工具的分析与比较
♦ 快速搞定SQL Server锁定阻塞 远离等待
♦ 智慧的传统医学:IBM的“标准化”中医
♦ 小技巧大能耐 搞定VS2008成功迁移2010
♦ Android会成为下一个Linux?
♦ Meego上网本疯狂体验
♦ Linux 和 Android 不可以合好吗?
♦ Android增语音操作功能可语音发送短信
♦ 惠普通吃:推WebOS和Windows7平板电脑
♦ 最让人郁闷的五种程序注释方式
(请到相应页面或分类阅读全部文章......)


发表评论