知识大全 在Java应用程序读取8位和24位Windows位图

Posted

篇首语:盛年不重来,一日难再晨。及时宜自勉,岁月不待人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在Java应用程序读取8位和24位Windows位图相关的知识,希望对你有一定的参考价值。

在Java应用程序读取8位和24位Windows位图  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Java 的当前发行版并不正式支持在 Java 应用程序中读取 Microsoft Windows 位图文件 但别担心 我们有办法解决这个问题!这篇技巧将说明如何完成这一任务 我们首先说明读取 Microsoft Windows 文件格式的基本步骤     Windows DIB(设备独立的位图)文件格式比较简单 与纯位图格式不同 DIB 格式保留着用于在内存中存储图像的明确信息 问题是图像格式的变体如此之多( 位 位 位和 位 以及其他格式) 本篇 Java 技巧中提供的解决方案只处理 位和 位两种格式 这两种格式代表了最常见的变体     不管是哪种 Windows DIB 子类型 这种文件格式总是由 位文件头和 位信息头组成 这两个标头精确包含有关文件的存储内容和存储次序的信息 有关标头中每一项的确切含义 请参考 Microsoft Sofare Development Kit (SDK) 文件其余部分的内容随信息头中数据的不同而不同     我们看一下本文要处理的两种子类型 位格式很简单 RGB(红 绿 蓝)颜色值( 个字节 并按 BGR 排序)紧接在信息头之后 但是 每个扫描行都被补足到 个字节 按照说明文档(请参阅 Microsoft SDK)的说法 这种 补足 是为了优化 Windows 位图绘图 API 同时 底部的扫描行是文件中的第一项内容 因此相对普通的图形坐标系统(其矢量方向的正向分别为向下和向右)而言 必须从后向前读取图像      位子类型由于在信息头和象素数据之间插入调色板信息而复杂化 因此 每个象素条目只是进入 位 RGB 颜色的调色板数组的一个 位索引 在象素信息中 每个扫描行同样被补足到 个字节     请注意 本文提供的位图图像加载方法不支持对压缩位图图像进行解压缩 实际上 这个例程甚至不寻求这种可能性!如果遇到压缩 Windows DIB 文件 该例程肯定会产生异常 Windows SDK 中有对压缩 Windows DIB 格式的说明     至于性能 在运行 Microsoft Windows 的 DX MHz 系统上 该例程读取 位 x 的文件(大约 千字节)所需的时间不超过 秒 使用 BufferedInputStream 而不是 FileInputStream 可明显提高性能     以下例程读取两种文件格式中的任一种 并生成一个 Image 图像 以下代码并未包含全面的错误和异常处理 以避免使该例程更加复杂 您总可用 Windows Paint 程序对不支持的 Windows DIB 子类型进行转换     /**  loadbitmap() 方法由 Windows C 代码转换而来   只能读取未压缩的 位和 位图像 已在  Windows 上用 Microsoft Paint 保存的图像  对它进行了测试 如果图像不是 位或 位图像   该程序拒绝进行任何尝试 我猜测如果先用   然后用 对字节执行掩码操作 则也可将 位  图像包括在内 我实际上对这些图像不感兴趣   如果尝试读取压缩图像 该例程可能失败 并产生  一个 IOException 异常 如果变量 npression  不为 则表示已经过压缩     参数   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= ; // 字节 BITMAPFILEHEADER  byte bf[]=new byte[bflen];  fs read(bf bflen);  int bilen= ; // 字节 BITMAPINFOHEADER  byte bi[]=new byte[bilen];  fs read(bi bilen);    // 解释数据   int nsize = (((int)bf[ ]& xff)< < )  | (((int)bf[ ]& xff)< < )  | (((int)bf[ ]& xff)< < )  | (int)bf[ ]& xff;  System out println( File type is : +(char)bf[ ]+(char)bf[ ]);  System out println( Size of file is : +nsize);    int nbisize = (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (int)bi[ ]& xff;  System out println( Size of bitmapinfoheader is : +nbisize);    int nwidth = (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (int)bi[ ]& xff;  System out println( Width is : +nwidth);    int nheight = (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (int)bi[ ]& xff;  System out println( Height is : +nheight);    int nplanes = (((int)bi[ ]& xff)< < ) | (int)bi[ ]& xff;  System out println( Planes is : +nplanes);    int nbitcount = (((int)bi[ ]& xff)< < ) | (int)bi[ ]& xff;  System out println( BitCount is : +nbitcount);    // 查找表明压缩的非零值  int npression = (((int)bi[ ])< < )  | (((int)bi[ ])< < )  | (((int)bi[ ])< < )  | (int)bi[ ];  System out println( Compression is : +npression);    int nsizeimage = (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (int)bi[ ]& xff;  System out println( SizeImage is : +nsizeimage);    int nxpm = (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (int)bi[ ]& xff;  System out println( X Pixels per meter is : +nxpm);    int nypm = (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (int)bi[ ]& xff;  System out println( Y Pixels per meter is : +nypm);    int nclrused = (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (int)bi[ ]& xff;  System out println( Colors used are : +nclrused);    int nclrimp = (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (((int)bi[ ]& xff)< < )  | (int)bi[ ]& xff;  System out println( Colors important are : +nclrimp);    if (nbitcount== )    // 位格式不包含调色板数据 但扫描行被补足到  // 个字节   int npad = (nsizeimage / nheight) nwidth * ;  int ndata[] = new int [nheight * nwidth];  byte brgb[] = new byte [( nwidth + npad) * * nheight];  fs read (brgb (nwidth + npad) * * nheight);  int nindex = ;  for (int j = ; j < nheight; j++)    for (int i = ; i < nwidth; i++)    ndata [nwidth * (nheight j ) + i] =  ( & xff)< <   | (((int)brgb[nindex+ ]& xff)< < )  | (((int)brgb[nindex+ ]& xff)< < )  | (int)brgb[nindex]& xff;  // System out println( Encoded Color at (   +i+ +j+ )is: +nrgb+ (R G B)= (   +((int)(brgb[ ]) & xff)+   +((int)brgb[ ]& xff)+   +((int)brgb[ ]& xff)+ ) );  nindex += ;    nindex += npad;      image = createImage  ( new MemoryImageSource (nwidth nheight   ndata nwidth));    else if (nbitcount == )    // 必须确定颜色数 如果 clrsused 参数大于   // 则颜色数由它决定 如果它等于 则根据  // bitsperpixel 计算颜色数   int nNumColors = ;  if (nclrused > )    nNumColors = nclrused;    else    nNumColors = ( & xff)< < nbitcount;    System out println( The number of Colors is +nNumColors);    // 某些位图不计算 sizeimage 域 请找出  // 这些情况并对它们进行修正   if (nsizeimage == )    nsizeimage = ((((nwidth*nbitcount)+ ) & ~ ) >> );  nsizeimage *= nheight;  System out println( nsizeimage (backup) is +nsizeimage);      // 读取调色板颜色   int npalette[] = new int [nNumColors];  byte bpalette[] = new byte [nNumColors* ];  fs read (bpalette nNumColors* );  int nindex = ;  for (int n = ; n < nNumColors; n++)    npalette[n] = ( & xff)< <   | (((int)bpalette[nindex + ]& xff)< < )  | (((int)bpalette[nindex + ]& xff)< < )  | (int)bpa cha138/Article/program/Java/Javascript/201311/25466

相关参考

知识大全 如何理解平台这个概念 如windows平台,linux平台,java平台

如何理解平台这个概念如windows平台,linux平台,java平台可以理解为环境即能使程序运行的软硬件环境如何将非JAVA平台变成JAVA平台?(手机的)那属于硬件问题,改不掉的,就像初期的mtk

知识大全 Java相对路径读取文件

Java相对路径读取文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不管你是新手还是老鸟在程

知识大全 java读取文本文件代码

java读取文本文件的方法有很多这个例子主要介绍最简单最常用的BufferedReader类    完整例子如下    packagenetchinaunixbloghzmtext;    impor

知识大全 win7家庭普通版32位和64位区别大么

win7家庭普通版32位和64位区别大么?是不是绝大多数软件,特别是常用软件都支持64位?32位操作系统:无论是32位处理器还是64位处理器都支持。64位操作系统:只有64位处理器才能支持。其实大多数

知识大全 java 读取网络照片

  importjavaioBufferedInputStream;  importjavaioBufferedOutputStream;  importjavaioFileOutputStream;

知识大全 JAVA如何实现从最后一行读取文件

JAVA如何实现从最后一行读取文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JAVA如何实

知识大全 java 读取properties 文件

  使用javautilProperties类的load()方法  示例  InputStreamin=newBufferedInputStream(newFileInputStream(name))

知识大全 Java设置与读取Cookie属性

Java设置与读取Cookie属性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  除了对数据的保

知识大全 Java Socket通信读取相关信息代码

JavaSocket通信读取相关信息代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java

知识大全 JAVA读取xml文件中节点值

JAVA读取xml文件中节点值  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  importwcd