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

相关文章

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装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实