⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8.html

📁 写给JSP初级程序员的书
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<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>作者:Jean-Pierre Dub&eacute</td> </p>
      </tr>
      <tr>
        <td WIDTH="100%" bordercolor="#FFFFFF" CLASS="t" bgcolor="#F0F0F0" colspan="2">
        
<!-- startindex -->
<strong class="title">Java 技巧 60:用 Java 保存位图文件</strong><BR> 
<strong class="subtitle">教程 -- 其中包括将图像对象写入位图文件的全部代码</strong><BR><BR> 

<p>(本文选自IBM developerWorks中文网站)</p> 
<p> </p>

<BLOCKQUOTE><I>
<STRONG>摘要</STRONG><BR>
虽然 Java 提供了几种打开图像的机制,但保存图像并不是它的强项。这篇技巧将讲述如何将图像保存在 24 位位图文件中。另外,Jean-Pierre 还提供了将图像文件写入位图文件所需的全部代码。 
<em></em></i></BLOCKQUOTE>
<!-- begin body text -->
这篇技巧是 "在 Java 应用程序中加载位图文件的逐步指南"  的补充,那篇技巧说明了在 Java 应用程序中加载位图文件的过程。本月我再提供一篇教程,说明如何将图像保存在 24 位位图文件中,其中还包含将图像对象写入位图文件的代码片断。 
<P>
如果您在 Microsoft Windows 环境中工作,那么创建位图文件的功能将为您提供许多方便。例如,在我的上一个项目中,我必须将 Java 与 Microsoft Access 对接。Java 程序允许用户在屏幕上绘图。这幅图随后被打印到 Microsoft 
Access 报表中。由于 Java 不支持 OLE,我的唯一选择就是创建该图的一个位图文件,并通知 Microsoft Access 报表在何处能找到这个位图文件。如果您写过向剪贴板发送图像的应用程序,则这个技巧可能对您有用 -- 尤其是当您将这个信息传递给另一个应用程序时。 
<P>
<FONT SIZE="+1"><STRONG>位图文件的格式</STRONG></FONT><BR>
位图文件格式支持 4 位 RLE(行程长度编码)以及 8 位和 24 位编码。因为我们只处理 24 位格式,所以下面我们查看一下该文件的结构。 
<P>
位图文件分为三个部分。我已将它们列在下面。
<P>
<FONT SIZE="+1"><STRONG>第 1 部分:位图文件的标头</STRONG></FONT><BR>
标头包含位图文件的类型大小信息和版面信息。结构如下(摘自 C 语言结构定义): 
<P>
<code>
typedef struct tagBITMAPFILEHEADER {<BR> 
&nbsp;&nbsp;&nbsp;UINT bfType;<BR> 
&nbsp;&nbsp;&nbsp;DWORD bfSize;<BR> 
&nbsp;&nbsp;&nbsp;UINT bfReserved1;<BR> 
&nbsp;&nbsp;&nbsp;UINT bfReserved2;<BR> 
&nbsp;&nbsp;&nbsp;DWORD bfOffBits;<BR> 
}BITMAPFILEHEADER;<BR>
</code>
<P>
下面是对这个清单中的代码元素的说明:
<P>
<ul>
<li><code>bfType</code>:指定文件类型,其值始终为 BM。 
<P>
<li><code>bfSize</code>:指定整个文件的大小(以字节为单位)。
<P>
<li><code>bfReserved1</code>:保留 -- 必须为 0。 
<P>
<li><code>bfReserved2</code>:保留 -- 必须为 0。 
<P>
<li><code>bfOffBits</code>:指定从 <code>BitmapFileHeader</code> 到图像首部的字节偏移量。 
</ul>
<P>
现在您已经明白位图标头的用途就是标识位图文件。读取位图文件的每个程序都使用位图标头来进行文件验证。
<P>
<FONT SIZE="+1"><STRONG>第 2 部分:位图信息标头</STRONG></FONT><BR> 
随后的标头称为<em>信息标头</em>,其中包含图像本身的属性。
<P>
下面说明如何指定 Windows 3.0(或更高版本)设备独立位图 (DIB) 的大小和颜色格式: 
<P>
<code>
typedef struct tagBITMAPINFOHEADER {<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;DWORD biSize;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;LONG  biWidth;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;LONG  biHeight;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;WORD  biPlanes;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;WORD  biBitCount;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;DWORD biCompression;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;DWORD biSizeImage;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;LONG  biXPelsPerMeter;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;LONG  biYPelsPerMeter;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;DWORD biClrUsed;<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;DWORD biClrImportant;<BR> 
} BITMAPINFOHEADER;<BR> 
</code>
<P>
以上代码清单的每个元素说明如下:
<P>
<ul>
<li><code>biSize</code>:指定 <code>BITMAPINFOHEADER</code> 结构所需的字节数。 
<P>
<li><code>biWidth</code>:指定位图的宽度(以象素为单位)。
<P>
<li><code>biHeight</code>:指定位图的高度(以象素为单位)。
<P>
<li><code>biPlanes</code>:指定目标设备的位面数。这个成员变量的值必须为 1。 
<P>
<li><code>biBitCount</code>:指定每个象素的位数。 
其值必须为 1、4、8 或 24。 
<P>
<li><code>biCompression</code>:指定压缩位图的压缩类型。在 24 位格式中,该变量被设置为 0。 
<P>
<li>biSizeImage:指定图像的大小(以字节为单位)。如果位图的格式是 <code>BI_RGB</code>,则将此成员变量设置为 0 是有效的。 
<P>
<li>biXPelsPerMeter:为位图指定目标设备的水平分辨率(以“象素/米”为单位)。应用程序可用该值从最符合当前设备特征的资源群组中选择一个位图。
<P>
<li>biYPelsPerMeter:为位图指定目标设备的垂直分辨率(以“象素/米”为单位)。
<P>
<li>biClrUsed:指定位图实际所用的颜色表中的颜色索引数。如果 <code>biBitCount</code> 设为 24,则 <code>biClrUsed</code> 指定用来优化 Windows 调色板性能的参考颜色表。 
<P>
<li>biClrImportant:指定对位图的显示有重要影响的颜色索引数。如果此值为 0,则所有颜色都很重要。 
</ul>
<P>
现在已定义了创建图像所需的全部信息。
<P>
<FONT SIZE="+1"><STRONG>第 3 部分:图像</STRONG></FONT><BR>
在 24 位格式中,图像中的每个象素都由存储为 BRG 的三字节 RGB 序列表示。每个扫描行都被补足到 4 位。为了使这个过程稍复杂一点,图像是自底而上存储的,即第一个扫描行是图像中的最后一个扫描行。下图显示了标头 (<code>BITMAPHEADER</code>) 和 (<code>BITMAPINFOHEADER</code>) 以及部分图像。各个部分由垂线分隔: 
<P>
<code>                 
0000000000    4D42   B536   0002   0000   0000   0036   0000 | 0028<BR> 
0000000020    0000   0107   0000   00E0   0000   0001   0018   0000<BR> 
0000000040    0000   B500   0002   0EC4   0000   0EC4   0000   0000<BR> 
0000000060    0000   0000   0000 | FFFF   FFFF   FFFF   FFFF   FFFF<BR> 
0000000100    FFFF   FFFF   FFFF   FFFF   FFFF   FFFF   FFFF   FFFF<BR> 
*<BR>
</code>
<P>
<FONT SIZE="+1"><STRONG>现在,我们开始检视代码</STRONG></FONT><BR>
现在我们已经知道了 24 位位图文件的结构,下面就是您期待已久的内容:用来将图像对象写入位图文件的代码。 
<P>
<code>
import java.awt.*;<BR> 
import java.io.*;<BR> 
import java.awt.image.*;<BR> 
<BR>
public class BMPFile extends Component {<BR> 
<BR>
&nbsp;&nbsp;//--- 私有常量<BR> 
&nbsp;&nbsp;private final static int BITMAPFILEHEADER_SIZE = 14;<BR> 
&nbsp;&nbsp;private final static int BITMAPINFOHEADER_SIZE = 40;<BR> 
<BR>
&nbsp;&nbsp;//--- 私有变量声明<BR> 
<BR>
&nbsp;&nbsp;//--- 位图文件标头<BR> 
&nbsp;&nbsp;private byte bitmapFileHeader [] = new byte [14];<BR> 
&nbsp;&nbsp;private byte bfType [] = {'B', 'M'};<BR> 
&nbsp;&nbsp;private int bfSize = 0;<BR> 
&nbsp;&nbsp;private int bfReserved1 = 0;<BR> 
&nbsp;&nbsp;private int bfReserved2 = 0;<BR> 
&nbsp;&nbsp;private int bfOffBits = BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE;<BR> 
<BR>
&nbsp;&nbsp;//--- 位图信息标头<BR> 
&nbsp;&nbsp;private byte bitmapInfoHeader [] = new byte [40];<BR> 
&nbsp;&nbsp;private int biSize = BITMAPINFOHEADER_SIZE;<BR> 
&nbsp;&nbsp;private int biWidth = 0;<BR> 
&nbsp;&nbsp;private int biHeight = 0;<BR> 
&nbsp;&nbsp;private int biPlanes = 1;<BR> 
&nbsp;&nbsp;private int biBitCount = 24;<BR> 
&nbsp;&nbsp;private int biCompression = 0;<BR> 
&nbsp;&nbsp;private int biSizeImage = 0x030000;<BR> 
&nbsp;&nbsp;private int biXPelsPerMeter = 0x0;<BR> 
&nbsp;&nbsp;private int biYPelsPerMeter = 0x0;<BR> 
&nbsp;&nbsp;private int biClrUsed = 0;<BR> 
&nbsp;&nbsp;private int biClrImportant = 0;<BR> 
<BR>
&nbsp;&nbsp;//--- 位图原始数据<BR> 
&nbsp;&nbsp;private int bitmap [];<BR> 
<BR>
&nbsp;&nbsp;//--- 文件部分<BR> 
&nbsp;&nbsp;private FileOutputStream fo;<BR> 
<BR>
&nbsp;&nbsp;//--- 缺省构造函数<BR> 
&nbsp;&nbsp;public BMPFile() {<BR> 
<BR>
&nbsp;&nbsp;}<BR>
<BR>
<BR>
&nbsp;&nbsp;public void saveBitmap (String parFilename, Image parImage, int<BR> 
parWidth, int parHeight) {<BR> 
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fo = new FileOutputStream (parFilename);<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;save (parImage, parWidth, parHeight);<BR> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fo.close ();        <BR> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception saveEx) {<BR> 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -