当前位置:  技术问答>java相关

如何用java编写BMP的显示程序???

    来源: 互联网  发布时间:2015-02-12

    本文导语:  前提:尽量不使用JNI,不使用vj编写 请指教! |      Java 技巧 43:如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图 在 Java 应用程序中加载位图文件的逐步指南 作者:Jeff...

前提:尽量不使用JNI,不使用vj编写
请指教!

|
 
  
Java 技巧 43:如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图
在 Java 应用程序中加载位图文件的逐步指南

作者:Jeff West 和 John D. Mitchell

摘要
目前,标准的 getImage() 方法仅支持 GIF 和 JPEG 图像。尽管存在用于读取 PNG(可移植网络图形)格式的 Java 例程,但我们还没听说过有用于读取 Microsoft Windows 位图图像的阅读程序。Jeff West 撰写的这篇技巧提供了加载 Windows 位图图像的代码。 
Java 的当前发行版并不正式支持在 Java 应用程序中读取 Microsoft Windows 位图文件。但别担心,我们有办法解决这个问题!这篇技巧将说明如何完成这一任务 -- 我们首先说明读取 Microsoft Windows 文件格式的基本步骤。 
Windows DIB(设备独立的位图)文件格式比较简单。与纯位图格式不同,DIB 格式保留着用于在内存中存储图像的明确信息。问题是图像格式的变体如此之多(1 位、4 位、8 位和 16 位,以及其他格式)。本篇 Java 技巧中提供的解决方案只处理 8 位和 24 位两种格式。这两种格式代表了最常见的变体。 

不管是哪种 Windows DIB 子类型,这种文件格式总是由 14 位文件头和 40 位信息头组成。这两个标头精确包含有关文件的存储内容和存储次序的信息。有关标头中每一项的确切含义,请参考 Microsoft Software Development Kit (SDK)。文件其余部分的内容随信息头中数据的不同而不同。 

我们看一下本文要处理的两种子类型。24 位格式很简单:RGB(红-绿-蓝)颜色值(3 个字节,并按 BGR 排序)紧接在信息头之后。但是,每个扫描行都被补足到 4 个字节。按照说明文档(请参阅 Microsoft SDK)的说法,这种“补足”是为了优化 Windows 位图绘图 API。同时,底部的扫描行是文件中的第一项内容 -- 因此相对普通的图形坐标系统(其矢量方向的正向分别为向下和向右)而言,必须从后向前读取图像。 

8 位子类型由于在信息头和象素数据之间插入调色板信息而复杂化。因此,每个象素条目只是进入 24 位 RGB 颜色的调色板数组的一个 8 位索引。在象素信息中,每个扫描行同样被补足到 4 个字节。 

请注意,本文提供的位图图像加载方法不支持对压缩位图图像进行解压缩。实际上,这个例程甚至不寻求这种可能性!如果遇到压缩 Windows DIB 文件,该例程肯定会产生异常。Windows SDK 中有对压缩 Windows DIB 格式的说明。 

至于性能,在运行 Microsoft Windows 95 的 486-DX2-66MHz 系统上,该例程读取 24 位 640 x 480 的文件(大约 920 千字节)所需的时间不超过 10 秒。使用 BufferedInputStream 而不是 FileInputStream 可明显提高性能。 

以下例程读取两种文件格式中的任一种,并生成一个 Image 图像。以下代码并未包含全面的错误和异常处理,以避免使该例程更加复杂。您总可用 Windows Paint 程序对不支持的 Windows DIB 子类型进行转换。 

    /**
 loadbitmap() 方法由 Windows C 代码转换而来。
 只能读取未压缩的 24 位和 8 位图像。已在
 Windows 95 上用 Microsoft Paint 保存的图像
对它进行了测试。如果图像不是 24 位或 8 位图像,
 该程序拒绝进行任何尝试。我猜测如果先用 1100,
 然后用 0011 对字节执行掩码操作,则也可将 4 位
 图像包括在内。我实际上对这些图像不感兴趣。
 如果尝试读取压缩图像,该例程可能失败,并产生
 一个 IOException 异常。如果变量 ncompression 
 不为 0,则表示已经过压缩。

 参数:
     sdir 和 sfile 是 FileDialog 的
     getDirectory() 和 getFile() 方法的结果。

 返回值:
     Image 对象,切记要检查 (Image)null !!!!

    */
    public Image loadbitmap (String sdir, String sfile)
 {
 Image image;
 System.out.println("loading:"+sdir+sfile);
 try
     {
     FileInputStream fs=new FileInputStream(sdir+sfile);
     int bflen=14; // 14 字节 BITMAPFILEHEADER
     byte bf[]=new byte[bflen];
     fs.read(bf,0,bflen);
     int bilen=40; // 40 字节 BITMAPINFOHEADER
     byte bi[]=new byte[bilen];
     fs.read(bi,0,bilen);

     // 解释数据。
     int nsize = (((int)bf[5]&0xff)

    
 
 

您可能感兴趣的文章:

  • VB编写的DLL不能被JAVA调用,用C将VB编写的DLL包装起来,做成一个新的DLL;用C编写的DLL可以被JAVA调用,用JAVA再进行一层的包装,因为JAV
  • 用jsp编写web程序到底和java serverlet编写web程序有和区别
  • 如何用java编写一个NT平台下的标准服务?
  • java能不能编写单独运行的程序?
  • 怎么用JBuild编写java console程序
  • 哪位有java通信方面的经验,谈谈如何利用java编写服务器程序来接受unix主机发送的数据信息?
  • linux下用java编写邮箱客户端程序与在windows下有什么不同??
  • 用JAVA编写COM组件
  • 使用editplus编写java如何编译成字节码文件,如何解释
  • JavaScript编写的Java虚拟机 BicaVM
  • 请问java用什么工具编写?在哪里运行?我刚开始学,不太懂,谢谢了
  • 想学JAVA,有没有轻量级一点的JAVA程序编写器????
  • 如何在linux下自动启动一个用Java编写的服务程序?
  • 求助:用java如何编写生成pdf格式报表的程序?
  • 请教如何使用Java编写的Applet程序关闭浏览器??
  • 怎样用java编写一个学籍管理系统?
  • oxfordxyc(石头) 能否给我也发一个java编写一个学籍管理系统,thx
  • 编写把一java程序中所有的print语句都删除,帮忙分析一下思路。
  • 刚学习Java,请教关于Java的Application代码编写问题。
  • 用java编写网络程序,那本书比较好?
  • 为什么我在java程序里启动的一个程序在java程序关闭后,该程序的所有进程都关掉了
  • 急!请问有分析java程序性能瓶颈的工具吗?例如,统计 java 程序中函数调用次数?
  • 请问从一个java程序中如何调用另一java程序,并控制可以其状态(最小化、最大化、结束程序),还有怎样知道那个被调用的程序结束。
  • Linux下面的开发好的Java程序,如何部署到其他机器?开发好的Java图形程序,终端上能否用?等问题
  • 我用telnet登陆到linux下运行了一个java程序,在关闭了telnet后怎么能让这个java程序继续执行
  • 我用telnet登陆到linux下运行了一个java程序,在关闭了telnet后怎么能让这个java程序继续执行,请高手指点一下
  • SecureCRT上运行一个JAVA程序,该程序类似一个在WINDOWS下一直运行的CMD窗口的东西,SecureCRT关掉后,JAVA还会继续运行吗?
  • 各位大虾,为什么我的java程序能通过编译,但是在用java命令运行程序的时候却老是报错“Exception in thread "main" java.lang.NoClassDe
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • 把java源程序生成应用程序有哪些方法?
  • 学习JAVA程序设计,有没有《WINDOWS程序设计》这样的经典书籍?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问java applet里,怎么能只显示图像的一部分,比如只显示图片的中间一块?
  • java for web程序在浏览器显示阴影而不显示内容?
  • jbuilder7里如何在project pane里显示出某个project的所有的类的结构图,就如显示source java files的结构图一样
  • 谁能帮我一下100分:在PDA的WinCE平台上,用JAVA语言开发程序,为什么不能在label,button显示汉字呢?却能在textarea中显示汉字呢!!!
  • 在JSP页面中能否显示JB中的对话框或者JAVA应用程序?是在web页面内显示。谢谢高手指点
  • 请教高手:我编的Applet插件只显示一个灰影,在JAVA控制台显示:awt.graphics2d.class没找到 请问应如何解决??
  • 求解:为什么我写的Java程序不能显示中文。
  • 我的JAVA怎么不能显示中文呢?源程序如下......?
  • 我在JSP页面中调用一段显示打印对话框的Java程序,可是点击“打印”按钮后什么都不显示,请大伙帮忙指点一下!
  • 如何在IBM Visualage for java的编辑环境中显示汉字??谢谢!
  • java汉字显示乱码问题??
  • cmd中显示不了java程序中的中文字
  • Java程序的显示问题
  • 在JAVA中如何正确显示中文字体?
  • 在JAVA中如何正确显示中文字体?
  • 管道线程能够接收数据,然后显示异常:java.io.IOException:write end dead;
  • 管道线程能够接收数据,然后显示异常:java.io.IOException:write end dead;(紧急求救,急急急)
  • 请碰到过的哥们回应。Java GUI程序中如何设置显示字体呢?
  • 求救!!!JAVA中怎么显示WORD文档。
  • java的中文显示问题
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3