Tiff文件解析和PackBits解压缩

2024-05-12 05:12
文章标签 解压缩 解析 tiff packbits

本文主要是介绍Tiff文件解析和PackBits解压缩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实现了Tiff图片文件格式的解析,对Tiff文件中的PackBits压缩格式进行解压缩,对Tiff文件中每一个Frame转换成BufferedImage显示。

Java语言实现,Eclipse下开发,AWT显示图片。

public static TIFF Parse(final byte[] bytes) throws IllegalAccessException {BinaryBuffer is = new BinaryBuffer(bytes);TIFF tiff = new TIFF();FileHeader header = new FileHeader();header.setByteOrder( is.ReadAsciiString(2));if (header.getByteOrder().equals("II"))is.SetByteOrder(ByteOrder.LITTLE_ENDIAN);else if (header.getByteOrder().equals( "MM"))is.SetByteOrder(ByteOrder.BIG_ENDIAN);elsethrow new java.lang.IllegalAccessException(header.getByteOrder());header.setLabel( is.ReadBytes(2));header.setOffset( is.ReadUInt32());tiff.setHeader(header);int position = (int) header.getOffset();			while (position != 0 ) {is.SetPosition(position);FileDirectory ifd = new FileDirectory();ifd.setEntryCount( is.ReadUInt16() );for (int i=0; i<ifd.getEntryCount(); i++) {Entry entry = new Entry();entry.setTag( is.ReadUInt16() );entry.setType( is.ReadUInt16() );entry.setCount( is.ReadInt32() );entry.setValue( is.ReadInt32() );if (entry.getType() == 1) { // 8-bit unsigned integerint count = 1 * entry.getCount();if (count <=4)entry.setData(new byte[] {  });else {is.SavePoint();is.SetPosition(entry.getValue());entry.setData( is.ReadAsciiChar(entry.getCount()));is.RestorePoint();}}else if (entry.getType() == 2) { // 8-bit, NULL-terminated stringint count = 1 * entry.getCount();if (count <=4)entry.setData(new char[] {  });else {is.SavePoint();is.SetPosition(entry.getValue());entry.setData( is.ReadAsciiChar(entry.getCount()));is.RestorePoint();}}else if (entry.getType() == 3) { // 16-bit unsigned integerint count = 2 * entry.getCount();if (count <= 4) {entry.setData( entry.getValue());}else {is.SavePoint();is.SetPosition(entry.getValue());entry.setData( is.ReadUInt16(entry.getCount()));is.RestorePoint();}}else if (entry.getType() == 4) { // 32-bit unsigned integerint count = 4 * entry.getCount();if (count <= 4 )entry.setData(entry.getValue());else {is.SavePoint();is.SetPosition(entry.getValue());entry.setData( is.ReadUInt32(entry.getCount()));is.RestorePoint();}}else if (entry.getType() == 5) { // Two 32-bit unsigned integersis.SavePoint();is.SetPosition(entry.getValue());entry.setData( 1.0 * is.ReadUInt32() / is.ReadUInt32() );is.RestorePoint();}else if (entry.getType() == 6) { // 8-bit signed integerthrow new java.lang.UnsupportedOperationException();}else if (entry.getType() == 7) { // 8-bit byteint count = 1 * entry.getCount();if (count <=4)entry.setData(new byte[] {  });else {is.SavePoint();is.SetPosition(entry.getValue());entry.setData( is.ReadAsciiChar(entry.getCount()));is.RestorePoint();}}else if (entry.getType() == 9) { // 32-bit signed integerint count = 4 * entry.getCount();if (count <= 4 )entry.setData(entry.getValue());else {is.SavePoint();is.SetPosition(entry.getValue());entry.setData( is.ReadInt32(entry.getCount()));is.RestorePoint();}}else if (entry.getType() == 10) { // Two 32-bit signed integersentry.setData( 1.0 * is.ReadInt32() / is.ReadInt32() );}else if (entry.getType() == 11) { // 4-byte single-precision IEEE throw new java.lang.UnsupportedOperationException();}else if (entry.getType() == 12) { // 8-byte double-precision IEEE throw new java.lang.UnsupportedOperationException();}else throw new java.lang.IllegalArgumentException(entry.getType() + "");ifd.getEntrys().add(entry);}ifd.setNext( is.ReadInt32());tiff.getDirectorys().add(ifd);position = ifd.getNext();}return tiff;}

解析Tiff文件第1个Frame的结构:

PackBits解压缩代码:

	public static byte[] uncompress(byte[] input) {ByteArrayOutputStream os = new ByteArrayOutputStream();int i = 0;do {byte n = input[i++];if (n < 0 && n > -128) {byte b = input[i++];for (int j=0; j<-n+1; j++)os.write(b);}else if (n >= 0 && n<=127) {int count = n + 1;for (int j=0; j<count; j++)os.write(input[i++]);}} while (i<input.length);return os.toByteArray();}

在AWT显示Tiff图像中32个Frame图像,采用GridLayout布局,效果如下

这篇关于Tiff文件解析和PackBits解压缩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981695

相关文章

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧