9.html
来自「写给JSP初级程序员的书」· HTML 代码 · 共 325 行 · 第 1/2 页
HTML
325 行
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="description" content="Java,JDBC,EJB,Open Source,jdk,rmi">
<meta name="Keywords"
content="Java, servlets, Java servlet, Javascript, ActiveX, VRML,
applet, applets, directory, news, jdbc, applications,
Java applications, Java developer, Java development, developer,
classes, Jars.com, Jars, intranet, Java applet, Javabeans,
Java products, JDK, Java development kit, java development environment, JIT,
JavaPlan, enterprise tools, JVM, Java Virtual Machine, Java resources,
SUN, CGI, Perl, database, network, html,
xml, dhtml, rating, ratings, review, jars, cgi, programming,
software review, software rating">
<title>csdn_在 Java 应用程序中加载位图文件的逐步指南</title>
<style>
.news { BACKGROUND: #007cd3; font-family: "宋体"; font-size: 9pt }
.t { font-family: "宋体"; font-size: 9pt }
.t1 { color:#007cd3; font-family: "宋体"; font-size: 9pt }
.white { font-family: "宋体"; font-size: 9pt;color:#FFFFFF }
.red { font-family: "宋体"; font-size: 9pt;color:#FF0000 }
A:visited {color:#0000FF}
A:hover {color: #ff6666; text-decoration: none}
.text {font-size: 12px; line-height: 160%; font-family: "宋体"}
.text1 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text1:visited {color:#000000}
.text1:hover {color: #000000}
.text2 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text2:visited {color:#000000}
.text2:hover {color: #000000}
.text3 {font-size: 12px; line-height: 100%; font-family: "宋体"; text-decoration: none}
.large {font-size: 14.8px; line-height: 130%}
</style>
</head>
<body
<!--start first table -->
<tr>
<td WIDTH="100%" VALIGN="TOP">
<tr>
<td WIDTH="100%" CLASS="white"></td>
</tr>
<tr>
<td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>在 Java 应用程序中加载位图文件的逐步指南</td>
<p> <td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>作者:Jeff West 和 John D. Mitchell</td></p>
</tr>
<tr>
<td WIDTH="100%" bordercolor="#FFFFFF" CLASS="t" bgcolor="#F0F0F0" colspan="2">
<strong class="title">Java 技巧 43:如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图</strong><BR>
<strong class="subtitle">在 Java 应用程序中加载位图文件的逐步指南</strong><BR><BR>
(本文选自IBM developerWorks中文网站)
<BLOCKQUOTE><em>
<STRONG>摘要</STRONG><BR>
目前,标准的 <code>getImage()</code> 方法仅支持 GIF 和 JPEG 图像。尽管存在用于读取 PNG(可移植网络图形)格式的 Java 例程,但我们还没听说过有用于读取 Microsoft Windows 位图图像的阅读程序。Jeff West 撰写的这篇技巧提供了加载 Windows 位图图像的代码。</em>
</BLOCKQUOTE>
<!-- begin body text -->
Java 的当前发行版并不正式支持在 Java 应用程序中读取 Microsoft
Windows 位图文件。但别担心,我们有办法解决这个问题!这篇技巧将说明如何完成这一任务 -- 我们首先说明读取 Microsoft Windows 文件格式的基本步骤。
<P>
Windows DIB(设备独立的位图)文件格式比较简单。与纯位图格式不同,DIB 格式保留着用于在内存中存储图像的明确信息。
问题是图像格式的变体如此之多(1 位、4 位、8 位和 16 位,以及其他格式)。本篇 Java 技巧中提供的解决方案只处理 8 位和 24 位两种格式。这两种格式代表了最常见的变体。
<P>
不管是哪种 Windows DIB 子类型,这种文件格式总是由 14 位文件头和 40 位信息头组成。这两个标头精确包含有关文件的存储内容和存储次序的信息。有关标头中每一项的确切含义,请参考 Microsoft Software Development Kit (SDK)。文件其余部分的内容随信息头中数据的不同而不同。
<P>
我们看一下本文要处理的两种子类型。24 位格式很简单:RGB(红-绿-蓝)颜色值(3 个字节,并按 BGR 排序)紧接在信息头之后。但是,每个扫描行都被补足到 4 个字节。按照说明文档(请参阅 Microsoft SDK)的说法,这种“补足”是为了优化 Windows 位图绘图 API。同时,底部的扫描行是文件中的第一项内容 -- 因此相对普通的图形坐标系统(其矢量方向的正向分别为向下和向右)而言,必须从后向前读取图像。
<P>
8 位子类型由于在信息头和象素数据之间插入调色板信息而复杂化。
因此,每个象素条目只是进入 24 位 RGB 颜色的调色板数组的一个 8 位索引。在象素信息中,每个扫描行同样被补足到 4 个字节。
<P>
请注意,本文提供的位图图像加载方法不支持对压缩位图图像进行解压缩。实际上,这个例程甚至不寻求这种可能性!如果遇到压缩 Windows DIB 文件,该例程肯定会产生异常。Windows SDK 中有对压缩 Windows DIB 格式的说明。
<P>
至于性能,在运行 Microsoft Windows 95 的 486-DX2-66MHz 系统上,该例程读取 24 位 640 x 480 的文件(大约 920 千字节)所需的时间不超过 10 秒。使用 <code>BufferedInputStream</code> 而不是 <code>FileInputStream</code> 可明显提高性能。
<p>
以下例程读取两种文件格式中的任一种,并生成一个 <code>Image</code> 图像。以下代码并未包含全面的错误和异常处理,以避免使该例程更加复杂。您总可用 Windows Paint 程序对不支持的 Windows DIB 子类型进行转换。
<P>
<code>
/**<BR>
loadbitmap() 方法由 Windows C 代码转换而来。<BR>
只能读取未压缩的 24 位和 8 位图像。已在<BR>
Windows 95 上用 Microsoft Paint 保存的图像<BR>
对它进行了测试。如果图像不是 24 位或 8 位图像,<BR>
该程序拒绝进行任何尝试。我猜测如果先用 1100,<BR>
然后用 0011 对字节执行掩码操作,则也可将 4 位<BR>
图像包括在内。我实际上对这些图像不感兴趣。<BR>
如果尝试读取压缩图像,该例程可能失败,并产生<BR>
一个 IOException 异常。如果变量 ncompression <BR>
不为 0,则表示已经过压缩。<BR>
<BR>
参数:<BR>
sdir 和 sfile 是 FileDialog 的<BR>
getDirectory() 和 getFile() 方法的结果。<BR>
<BR>
返回值:<BR>
Image 对象,切记要检查 (Image)null !!!!<BR>
<BR>
*/<BR>
public Image loadbitmap (String sdir, String sfile)<BR>
{<BR>
Image image;<BR>
System.out.println("loading:"+sdir+sfile);<BR>
try<BR>
{<BR>
FileInputStream fs=new FileInputStream(sdir+sfile);<BR>
int bflen=14; // 14 字节 BITMAPFILEHEADER<BR>
byte bf[]=new byte[bflen];<BR>
fs.read(bf,0,bflen);<BR>
int bilen=40; // 40 字节 BITMAPINFOHEADER<BR>
byte bi[]=new byte[bilen];<BR>
fs.read(bi,0,bilen);<BR>
<BR>
// 解释数据。<BR>
int nsize = (((int)bf[5]&0xff)<<24) <BR>
| (((int)bf[4]&0xff)<<16)<BR>
| (((int)bf[3]&0xff)<<8)<BR>
| (int)bf[2]&0xff;<BR>
System.out.println("File type is :"+(char)bf[0]+(char)bf[1]);<BR>
System.out.println("Size of file is :"+nsize);<BR>
<BR>
int nbisize = (((int)bi[3]&0xff)<<24)<BR>
| (((int)bi[2]&0xff)<<16)<BR>
| (((int)bi[1]&0xff)<<8)<BR>
| (int)bi[0]&0xff;<BR>
System.out.println("Size of bitmapinfoheader is :"+nbisize);<BR>
<BR>
int nwidth = (((int)bi[7]&0xff)<<24)<BR>
| (((int)bi[6]&0xff)<<16)<BR>
| (((int)bi[5]&0xff)<<8)<BR>
| (int)bi[4]&0xff;<BR>
System.out.println("Width is :"+nwidth);<BR>
<BR>
int nheight = (((int)bi[11]&0xff)<<24)<BR>
| (((int)bi[10]&0xff)<<16)<BR>
| (((int)bi[9]&0xff)<<8)<BR>
| (int)bi[8]&0xff;<BR>
System.out.println("Height is :"+nheight);<BR>
<BR>
int nplanes = (((int)bi[13]&0xff)<<8) | (int)bi[12]&0xff;<BR>
System.out.println("Planes is :"+nplanes);<BR>
<BR>
int nbitcount = (((int)bi[15]&0xff)<<8) | (int)bi[14]&0xff;<BR>
System.out.println("BitCount is :"+nbitcount);<BR>
<BR>
// 查找表明压缩的非零值<BR>
int ncompression = (((int)bi[19])<<24)<BR>
| (((int)bi[18])<<16)<BR>
| (((int)bi[17])<<8)<BR>
| (int)bi[16];<BR>
System.out.println("Compression is :"+ncompression);<BR>
<BR>
int nsizeimage = (((int)bi[23]&0xff)<<24)<BR>
| (((int)bi[22]&0xff)<<16)<BR>
| (((int)bi[21]&0xff)<<8)<BR>
| (int)bi[20]&0xff;<BR>
System.out.println("SizeImage is :"+nsizeimage);<BR>
<BR>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?