📄 久久网络-网络学堂-用 java 保存位图文件.htm
字号:
<BR><BR> biSizeImage:指定图像的大小(以字节为单位)。如果位图的格式是 BI_RGB,则将此成员变量设置为 0
是有效的。
<BR><BR> biXPelsPerMeter:为位图指定目标设备的水平分辨率(以“象素/米”为单位)。应用程序可用该值从最符合当前设备特征的资源群组中选择一个位图。
<BR><BR> biYPelsPerMeter:为位图指定目标设备的垂直分辨率(以“象素/米”为单位)。
<BR><BR> biClrUsed:指定位图实际所用的颜色表中的颜色索引数。如果 biBitCount 设为 24,则
biClrUsed 指定用来优化 Windows 调色板性能的参考颜色表。
<BR><BR> biClrImportant:指定对位图的显示有重要影响的颜色索引数。如果此值为 0,则所有颜色都很重要。
<BR><BR> 现在已定义了创建图像所需的全部信息。 <BR><BR> 第 3 部分:图像<BR><BR> 在 24
位格式中,图像中的每个象素都由存储为 BRG 的三字节 RGB 序列表示。每个扫描行都被补足到 4
位。为了使这个过程稍复杂一点,图像是自底而上存储的,即第一个扫描行是图像中的最后一个扫描行。下图显示了标头 (BITMAPHEADER)
和 (BITMAPINFOHEADER) 以及部分图像。各个部分由垂线分隔: <BR><BR>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><BR>在,我们开始检视代码<BR><BR> 现在我们已经知道了 24
位位图文件的结构,下面就是您期待已久的内容:用来将图像对象写入位图文件的代码。 <BR>import
java.awt.*;<BR>import java.io.*;<BR>import
java.awt.image.*;<BR><BR>public class BMPFile extends Component
{<BR><BR>file://--- 私有常量<BR>private final static int
BITMAPFILEHEADER_SIZE = 14;<BR>private final static int
BITMAPINFOHEADER_SIZE = 40;<BR><BR>file://---
私有变量声明<BR><BR>file://--- 位图文件标头<BR>private byte bitmapFileHeader []
= new byte [14];<BR>private byte bfType [] = {'B', 'M'};<BR>private
int bfSize = 0;<BR>private int bfReserved1 = 0;<BR>private int
bfReserved2 = 0;<BR>private int bfOffBits = BITMAPFILEHEADER_SIZE +
BITMAPINFOHEADER_SIZE;<BR><BR>file://--- 位图信息标头<BR>private byte
bitmapInfoHeader [] = new byte [40];<BR>private int biSize =
BITMAPINFOHEADER_SIZE;<BR>private int biWidth = 0;<BR>private int
biHeight = 0;<BR>private int biPlanes = 1;<BR>private int biBitCount
= 24;<BR>private int biCompression = 0;<BR>private int biSizeImage =
0x030000;<BR>private int biXPelsPerMeter = 0x0;<BR>private int
biYPelsPerMeter = 0x0;<BR>private int biClrUsed = 0;<BR>private int
biClrImportant = 0;<BR><BR>file://--- 位图原始数据<BR>private int bitmap
[];<BR><BR>file://--- 文件部分<BR>private FileOutputStream
fo;<BR><BR>file://--- 缺省构造函数<BR>public BMPFile()
{<BR><BR>}<BR><BR><BR>public void saveBitmap (String parFilename,
Image parImage, int<BR>parWidth, int parHeight) {<BR><BR>try {<BR>fo
= new FileOutputStream (parFilename);<BR>save (parImage, parWidth,
parHeight);<BR>fo.close (); <BR>}<BR>catch (Exception saveEx)
{<BR>saveEx.printStackTrace ();<BR>}<BR><BR>}<BR><BR><BR>/*<BR>*
saveMethod 是该进程的主方法。该方法<BR>* 将调用 convertImage 方法以将内存图像转换为<BR>*
字节数组;writeBitmapFileHeader 方法创建并写入<BR>* 位图文件标头;writeBitmapInfoHeader
创建 <BR>* 信息标头;writeBitmap 写入图像。<BR>*<BR>*/<BR>private void save
(Image parImage, int parWidth, int parHeight) {<BR><BR>try
{<BR>convertImage (parImage, parWidth,
parHeight);<BR>writeBitmapFileHeader ();<BR>writeBitmapInfoHeader
();<BR>writeBitmap ();<BR>}<BR>catch (Exception saveEx)
{<BR>saveEx.printStackTrace ();<BR>}<BR>}<BR><BR><BR>/*<BR>*
convertImage 将内存图像转换为位图格式 (BRG)。<BR>*
它还计算位图信息标头所用的某些信息。<BR>*<BR>*/<BR>private boolean convertImage (Image
parImage, int parWidth, int parHeight) {<BR><BR>int pad;<BR>bitmap =
new int [parWidth * parHeight];<BR><BR>PixelGrabber pg = new
PixelGrabber (parImage, 0, 0, parWidth, parHeight,<BR>bitmap, 0,
parWidth);<BR><BR>try {<BR>pg.grabPixels ();<BR>}<BR>catch
(InterruptedException e) {<BR>e.printStackTrace ();<BR>return
(false);<BR>}<BR><BR>pad = (4 - ((parWidth * 3) % 4)) *
parHeight;<BR>biSizeImage = ((parWidth * parHeight) * 3) +
pad;<BR>bfSize = biSizeImage + BITMAPFILEHEADER_SIZE
+<BR>BITMAPINFOHEADER_SIZE;<BR>biWidth = parWidth;<BR>biHeight =
parHeight;<BR><BR>return (true);<BR>}<BR><BR>/*<BR>* writeBitmap
将象素捕获器返回的图像转换为<BR>* 所需的格式。请记住:扫描行在位图文件中是<BR>* 反向存储的!<BR>*<BR>*
每个扫描行必须补足为 4 个字节。<BR>*/<BR>private void writeBitmap () {<BR><BR>int
size;<BR>int value;<BR>int j;<BR>int i;<BR>int rowCount;<BR>int
rowIndex;<BR>int lastRowIndex;<BR>int pad;<BR>int padCount;<BR>byte
rgb [] = new byte [3];<BR><BR><BR>size = (biWidth * biHeight) -
1;<BR>pad = 4 - ((biWidth * 3) % 4);<BR>if (pad == 4) // <====
错误修正<BR>pad = 0; // <==== 错误修正<BR>rowCount = 1;<BR>padCount =
0;<BR>rowIndex = size - biWidth;<BR>lastRowIndex =
rowIndex;<BR><BR>try {<BR>for (j = 0; j < size; j++) {<BR>value =
bitmap [rowIndex];<BR>rgb [0] = (byte) (value & 0xFF);<BR>rgb
[1] = (byte) ((value >> 8) & 0xFF);<BR>rgb [2] = (byte)
((value >> 16) & 0xFF);<BR>fo.write (rgb);<BR>if (rowCount
== biWidth) {<BR>padCount += pad;<BR>for (i = 1; i <= pad; i++)
{<BR>fo.write (0x00);<BR>}<BR>rowCount = 1;<BR>rowIndex =
lastRowIndex - biWidth;<BR>lastRowIndex =
rowIndex;<BR>}<BR>else<BR>rowCount++;<BR>rowIndex++;<BR>}<BR><BR>file://---
更新文件大小<BR>bfSize += padCount - pad;<BR>biSizeImage += padCount -
pad;<BR>}<BR>catch (Exception wb) {<BR>wb.printStackTrace
();<BR>}<BR><BR>} <BR><BR>/*<BR>* writeBitmapFileHeader
将位图文件标头写入文件中。<BR>*<BR>*/<BR>private void writeBitmapFileHeader ()
{<BR><BR>try {<BR>fo.write (bfType);<BR>fo.write (intToDWord
(bfSize));<BR>fo.write (intToWord (bfReserved1));<BR>fo.write
(intToWord (bfReserved2));<BR>fo.write (intToDWord
(bfOffBits));<BR><BR>}<BR>catch (Exception wbfh)
{<BR>wbfh.printStackTrace ();<BR>}<BR><BR>}<BR><BR>/*<BR>*<BR>*
writeBitmapInfoHeader 将位图信息标头<BR>* 写入文件中。<BR>*<BR>*/<BR><BR>private
void writeBitmapInfoHeader () {<BR><BR>try {<BR>fo.write (intToDWord
(biSize));<BR>fo.write (intToDWord (biWidth));<BR>fo.write
(intToDWord (biHeight));<BR>fo.write (intToWord
(biPlanes));<BR>fo.write (intToWord (biBitCount));<BR>fo.write
(intToDWord (biCompression));<BR>fo.write (intToDWord
(biSizeImage));<BR>fo.write (intToDWord
(biXPelsPerMeter));<BR>fo.write (intToDWord
(biYPelsPerMeter));<BR>fo.write (intToDWord
(biClrUsed));<BR>fo.write (intToDWord
(biClrImportant));<BR>}<BR>catch (Exception wbih)
{<BR>wbih.printStackTrace ();<BR>}<BR><BR>}<BR><BR><BR>/*<BR>*<BR>*
intToWord 将整数转换为单字,返回值<BR>* 存储在一个双字节数组中。<BR>*<BR>*/<BR>private byte
[] intToWord (int parValue) {<BR><BR>byte retValue [] = new byte
[2];<BR><BR>retValue [0] = (byte) (parValue &
0x00FF);<BR>retValue [1] = (byte) ((parValue >> 8) &
0x00FF);<BR><BR>return (retValue);<BR><BR>}<BR><BR>/*<BR>*<BR>*
intToDWord 将整数转换为双字,返回值<BR>* 存储在一个 4 字节数组中。<BR>*<BR>*/<BR>private
byte [] intToDWord (int parValue) {<BR><BR>byte retValue [] = new
byte [4];<BR><BR>retValue [0] = (byte) (parValue &
0x00FF);<BR>retValue [1] = (byte) ((parValue >> 8) &
0x000000FF);<BR>retValue [2] = (byte) ((parValue >> 16) &
0x000000FF);<BR>retValue [3] = (byte) ((parValue >> 24) &
0x000000FF);<BR><BR>return
(retValue);<BR><BR>}<BR><BR>}<BR><BR><BR> 小结<BR><BR> 这就是所要做的全部工作。我确信您将会发现这个类很有用,因为到
JDK 1.1.6 为止,Java 不支持用任何常用的格式保存图像。JDK 1.2 将支持创建 JPEG
图像,但不支持创建位图。所以这个类仍将填补 JDK1.2 中的空白。</TD></TR>
<TR>
<TD colSpan=2> </TD></TR>
<TR>
<TR height=22>
<TD>文章来源: </TD>
<TD align=right></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#336600> </TD>
<TD width=10> </TD>
<TD>统计信息:
<SCRIPT language=javascript
src="久久网络-网络学堂-用 Java 保存位图文件.files/count.htm"></SCRIPT>
</TD>
<TD align=right><A
href="http://www.99net.net/common/board.asp?bch=study&bid=68104647">发表评论</A>
<A href="http://www.99net.net/study/funcs/publish.asp">推荐文章</A> <A
href="javascript:window.close()">关闭窗口</A></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#336600> </TD>
<TD width=10> </TD>
<TD>
<TABLE cellSpacing=1 cellPadding=3 width="100%" align=center
bgColor=#999999 border=0>
<TBODY>
<TR>
<TD bgColor=#eeeeee> 相关文章</TD></TR>
<TR>
<TD bgColor=#ffffff>
<TABLE cellSpacing=2 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD>
<LI><A class=p11
href="http://www.99net.net/study/prog/6810294.htm"
target=_blank>Java中文问题详解</A></LI></TD>
<TD align=right><FONT color=#999999>2003-4-10
16:42:49</FONT></TD></TR>
<TR>
<TD>
<LI><A class=p11
href="http://www.99net.net/study/prog/68102718.htm"
target=_blank>JavaBean调用示例</A></LI></TD>
<TD align=right><FONT color=#999999>2003-4-10
16:41:42</FONT></TD></TR>
<TR>
<TD>
<LI><A class=p11
href="http://www.99net.net/study/prog/68103346.htm"
target=_blank>JAVA的网络功能与编程 二</A></LI></TD>
<TD align=right><FONT color=#999999>2003-4-10
16:45:24</FONT></TD></TR>
<TR>
<TD>
<LI><A class=p11
href="http://www.99net.net/study/page/67102716.htm"
target=_blank>一个通用验证javascript函数</A></LI></TD>
<TD align=right><FONT color=#999999>2003-4-10
14:20:46</FONT></TD></TR>
<TR>
<TD>
<LI><A class=p11
href="http://www.99net.net/study/prog/68103133.htm"
target=_blank>java bean 与 ejb的区别</A></LI></TD>
<TD align=right><FONT color=#999999>2003-4-10
16:44:19</FONT></TD></TR>
<TR>
<TD>
<LI><A class=p11
href="http://www.99net.net/study/prog/68102220.htm"
target=_blank>Java中利用散列表实现股票行情的查询</A></LI></TD>
<TD align=right><FONT color=#999999>2003-4-10
16:39:08</FONT></TD></TR>
<TR>
<TD>
<LI><A class=p11
href="http://www.99net.net/study/prog/6810335.htm"
target=_blank>Java的网络功能与编程 一</A></LI></TD>
<TD align=right><FONT color=#999999>2003-4-10
16:44:54</FONT></TD></TR>
<TR>
<TD>
<LI><A class=p11
href="http://www.99net.net/study/prog/68102446.htm"
target=_blank>JavaBean的事件 </A></LI></TD>
<TD align=right><FONT color=#999999>2003-4-10
16:40:16</FONT></TD></TR>
<TR>
<TD>
<LI><A class=p11
href="http://www.99net.net/study/prog/6810254.htm"
target=_blank>JavaBean用户化</A></LI></TD>
<TD align=right><FONT color=#999999>2003-4-10
16:40:40</FONT></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
<TBODY>
<TR>
<TD> </TD></TR>
<TR>
<TD align=middle><A href="http://www.99net.net/common/about.asp">网站简介</A>
| <A href="http://www.99net.net/common/flack.asp">广告服务</A> | <A
href="http://www.99net.net/common/program.asp">编程支持</A> | <A
href="http://www.99net.net/common/design.asp">设计服务</A> | <A
href="http://www.99net.net/common/team.asp">诚邀合作</A> | <A
href="http://www.99net.net/common/board.asp?bch=comment">访客留言</A></TD></TR>
<TR>
<TD align=middle>
<P>Copyright (C) 2000 99NET. All Rights Reserved<BR>版权所有 久久网络工作室
<BR>Email:<A
href="mailto:webmaster@99net.net">webmaster@99net.net</A></P></TD></TR></TBODY></TABLE>
<DIV align=center>
<SCRIPT language=javascript>
document.write("<a href=/count/cmain.asp?name=99net target=_blank><img src=/count/count.asp?user=99net&refer="+escape(document.referrer)+"&cur="+escape(document.URL)+" alt=久久友情 border=0 width=16 height=16></a>");
</SCRIPT>
</DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -