动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.按位“异或”赋值运算符 (^=).
.WirelessMessagingAPI(1).
.JDK1.4和JDK1.5在linux下的中文显.
.什么是线程?.
.深入理解Collections API.
.利用视图链接使Eclipse应用程序更.
.我的百宝箱之Eclipse 3.0.1插件方.
.程序员:Waiting Anywhere.
.构建自己的基于Java的超级计算机.
.JDK1.4非阻塞套接字API概述.
.通过三种方式对Struts框架进行扩.
.使用servlet和Java Bean访问MySQL.
.java编写TCP方式的通信程序.
.AWT机器人Robot.
.Java入门-关于字符串分割的两种方.
.Java中的Hashtable.
.体验Java 1.5中面向方面(AOP)编程.
.java.applet.Applet的 .
.eclipse-SDK-3.1M4-win32.
.Velocity中的变量问题的解决方法.

Java技巧:用Java保存位图文件

发表日期:2008-1-5 |



  假如您在 Microsoft Windows 环境中工作,那么创建位图文件的功能将为您提供许多方便。例如,在我的上一个项目中,我必须将 Java 与 Microsoft Access 对接。Java 程序答应用户在屏幕上绘图。这幅图随后被打印到 Microsoft Access 报表中。由于 Java 不支持 OLE,我的唯一选择就是创建该图的一个位图文件,并通知 Microsoft Access 报表在何处能找到这个位图文件。假如您写过向剪贴板发送图像的应用程序,则这个技巧可能对您有用 -- 尤其是当您将这个信息传递给另一个应用程序时。
  
  位图文件的格式
  位图文件格式支持 4 位 RLE(行程长度编码)以及 8 位和 24 位编码。因为我们只处理 24 位格式,所以下面我们查看一下该文件的结构。
  
  位图文件分为三个部分。我已将它们列在下面。
  
  第 1 部分:位图文件的标头
  标头包含位图文件的类型大小信息和版面信息。结构如下(摘自 C 语言结构定义):
  
  typedef strUCt tagBITMAPFILEHEADER {
  ??INT bfType;
  ??Word bfSize;
  ??INT bfReserved1;
  ??INT bfReserved2;
  ??WORD bfOffBits;
  }BITMAPFILEHEADER;
  
  
  下面是对这个清单中的代码元素的说明:
  
  
  bfType:指定文件类型,其值始终为 BM。
  
  bfSize:指定整个文件的大小(以字节为单位)。
  
  bfReserved1:保留 -- 必须为 0。
  
  bfReserved2:保留 -- 必须为 0。
  
  bfOffBits:指定从 BitmapFileHeader 到图像首部的字节偏移量。
  
  现在您已经明白位图标头的用途就是标识位图文件。读取位图文件的每个程序都使用位图标头来进行文件验证。
  
  第 2 部分:位图信息标头
  随后的标头称为信息标头,其中包含图像本身的属性。
  
  下面说明如何指定 Windows 3.0(或更高版本)设备独立位图 (DIB) 的大小和颜色格式:
  
  typedef struct tagBITMAPINFOHEADER {
  ??DWORD biSize;
  ??LONG biWidth;
  ??LONG biHeight;
  ??WORD biPlanes;
  ??WORD biBitCount;
  ??DWORD biCompression;
  ??DWORD biSizeImage;
  ??LONG biXPelsPerMeter;
  ??LONG biYPelsPerMeter;
  ??DWORD biClrUsed;
  ??DWORD biClrImportant;
  } BITMAPINFOHEADER;
  
  以上代码清单的每个元素说明如下:
  
  biSize:指定 BITMAPINFOHEADER 结构所需的字节数。
  
  biWidth:指定位图的宽度(以象素为单位)。
  
  biHeight:指定位图的高度(以象素为单位)。
  
  biPlanes:指定目标设备的位面数。这个成员变量的值必须为 1。
  
  biBitCount:指定每个象素的位数。 其值必须为 1、4、8 或 24。
  
  biCompression:指定压缩位图的压缩类型。在 24 位格式中,该变量被设置为 0。
  
  biSizeImage:指定图像的大小(以字节为单位)。假如位图的格式是 BI_RGB,则将此成员变量设置为 0 是有效的。
  
  biXPelsPerMeter:为位图指定目标设备的水平分辨率(以“象素/米”为单位)。应用程序可用该值从最符合当前设备特征的资源群组中选择一个位图。
  
  biYPelsPerMeter:为位图指定目标设备的垂直分辨率(以“象素/米”为单位)。
  
  biClrUsed:指定位图实际所用的颜色表中的颜色索引数。假如 biBitCount 设为 24,则 biClrUsed 指定用来优化 Windows 调色板性能的参考颜色表。
  
  biClrImportant:指定对位图的显示有重要影响的颜色索引数。假如此值为 0,则所有颜色都很重要。
  
  现在已定义了创建图像所需的全部信息。
  
  第 3 部分:图像
  在 24 位格式中,图像中的每个象素都由存储为 BRG 的三字节 RGB 序列表示。每个扫描行都被补足到 4 位。为了使这个过程稍复杂一点,图像是自底而上存储的,即第一个扫描行是图像中的最后一个扫描行。下图显示了标头 (BITMAPHEADER) 和 (BITMAPINFOHEADER) 以及部分图像。各个部分由垂线分隔:
  
  0000000000 4D42 B536 0002 0000 0000 0036 0000 0028
  0000000020 0000 0107 0000 00E0 0000 0001 0018 0000
  0000000040 0000 B500 0002 0EC4 0000 0EC4 0000 0000
  0000000060 0000 0000 0000 FFFF FFFF FFFF FFFF FFFF
  0000000100 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
  *
  
  现在,我们开始检视代码
  现在我们已经知道了 24 位位图文件的结构,下面就是您期待已久的内容:用来将图像对象写入位图文件的代码。
  
  import java.awt.*;
  import java.io.*;
  import java.awt.image.*;
  
  public class BMPFile extends Component {
  
  ?//--- 私有常量
  ?private final static int BITMAPFILEHEADER_SIZE = 14;
  ?private final static int BITMAPINFOHEADER_SIZE = 40;
  
  ?//--- 私有变量声明
  
  ?//--- 位图文件标头
  ?private byte bitmapFileHeader [] = new byte [14];
  ?private byte bfType [] = {'B', 'M'};
  ?private int bfSize = 0;
  ?private int bfReserved1 = 0;
  ?private int bfReserved2 = 0;
  ?private int bfOffBits = BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE;
  
  ?//--- 位图信息标头
  ?private byte bitmapInfoHeader [] = new byte [40];
  ?private int biSize = BITMAPINFOHEADER_SIZE;
  ?private int biWidth = 0;
  ?private int biHeight = 0;
  ?private int biPlanes = 1;
  ?private int biBitCount = 24;
  ?private int biCompression = 0;
  ?private int biSizeImage = 0x030000;
  ?private int biXPelsPerMeter = 0x0;
  ?private int biYPelsPerMeter = 0x0;
  ?private int biClrUsed = 0;
  ?private int biClrImportant = 0;
  
  ?//--- 位图原始数据
  ?private int bitmap [];
  
  ?//--- 文件部分
  ?private FileOutputStream fo;
  
  ?//--- 缺省构造函数
  ?public BMPFile() {
  
  ?}
  
  
  ?public void saveBitmap (String parFilename, Image parImage, int
  parWidth, int parHeight) {
  
  ???ry {
  ????fo = new FileOutputStream (parFilename);
  ????save (parImage, parWidth, parHeight);
  ????fo.close ();
  ???
  ???atch (Exception saveEx) {
  ????saveEx.printStackTrace ();
  ???
  
  ?}
  
  ?/*
  ?? saveMethod 是该进程的主方法。该方法
  ?? 将调用 convertImage 方法以将内存图像转换为
  ?? 字节数组;writeBitmapFileHeader 方法创建并写入
  ?? 位图文件标头;writeBitmapInfoHeader 创建
  ?? 信息标头;writeBitmap 写入图像。
  ??
  ??/
  ?private void save (Image parImage, int parWidth, int parHeight) {
  
  ???ry {
  ????convertImage (parImage, parWidth, parHeight);
  ????writeBitmapFileHeader ();
  ????writeBitmapInfoHeader ();
  ????writeBitmap ();
  ???
  ???atch (Exception saveEx) {
  ????saveEx.printStackTrace ();
  ???
  ?}
  
  ?/*
  ?? convertImage 将内存图像转换为位图格式 (BRG)。
  ?? 它还计算位图信息标头所用的某些信息。
  ??
  ??/
  ?private boolean convertImage (Image parImage, int parWidth, int parHeight) {
  
  ???nt pad;
  ???itmap = new int [parWidth * parHeight];
  
  ???ixelGrabber pg = new PixelGrabber (parImage, 0, 0, parWidth, parHeight,
  ?????????????????????itmap, 0, parWidth);
  
  ???ry {
  ????pg.grabPixels ();
  ???
  ???atch (InterruptedException e) {
  ????e.printStackTrace ();
  ????return (false);
  ???
  
  ???ad = (4 - ((parWidth * 3) % 4)) * parHeight;
  ???iSizeImage = ((parWidth * parHeight) * 3) + pad;
  ???fSize = biSizeImage + BITMAPFILEHEADER_SIZE +
  BITMAPINFOHEADER_SIZE;
  ???iWidth = parWidth;
  ???iHeight = parHeight;
  
  ???eturn (true);
  ?}
  
  ?/*
  ?? writeBitmap 将象素捕捉器返回的图像转换为
  ?? 所需的格式。请记住:扫描行在位图文件中是
  ?? 反向存储的!
  ??
  ?? 每个扫描行必须补足为 4 个字节。
  ??/
  ?private void writeBitmap () {
  
  ???int size;
  ???int value;
  ???int j;
  ???int i;
  ???int rowCount;
  ???int rowIndex;
  ???int lastRowIndex;
上一篇:JavaI/OAPI之性能分析(上) 人气:461
下一篇:比尔学Java:JavaSocket篇 人气:574
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成