知识大全 在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相对路径读取文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 不管你是新手还是老鸟在程
java读取文本文件的方法有很多这个例子主要介绍最简单最常用的BufferedReader类 完整例子如下 packagenetchinaunixbloghzmtext; impor
win7家庭普通版32位和64位区别大么?是不是绝大多数软件,特别是常用软件都支持64位?32位操作系统:无论是32位处理器还是64位处理器都支持。64位操作系统:只有64位处理器才能支持。其实大多数
importjavaioBufferedInputStream; importjavaioBufferedOutputStream; importjavaioFileOutputStream;
JAVA如何实现从最后一行读取文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JAVA如何实
使用javautilProperties类的load()方法 示例 InputStreamin=newBufferedInputStream(newFileInputStream(name))
Java设置与读取Cookie属性 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 除了对数据的保
JavaSocket通信读取相关信息代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java
JAVA读取xml文件中节点值 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! importwcd