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);
		else
			throw 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 integer
					int 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 string
					int 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 integer
					int 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 integer
					int 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 integers
					is.SavePoint();
					is.SetPosition(entry.getValue());
					entry.setData( 1.0 * is.ReadUInt32() / is.ReadUInt32() );
					is.RestorePoint();

				}
				else if (entry.getType() == 6) { // 8-bit signed integer
					throw new java.lang.UnsupportedOperationException();
				}
				else if (entry.getType() == 7) { // 8-bit byte
					int 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 integer
					int 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 integers
					entry.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布局,效果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/615053.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Rollup】用rollup从0到1开发一个js插件并发布到npm

Rollup 是一个 JavaScript 模块打包器&#xff0c;专注于打包 ES6 模块将其编译回多种模块化格式&#xff0c;尤其适合打包库和框架&#xff0c;因为它可以生成更小、更高效的代码&#xff0c;并且特别适合将代码打包成可在浏览器中使用的库。 从0到1开发js插件 1.创建文件夹…

解决docker安装Wordpress速度过慢的问题

先可以在dockerhub上查看Wordpress的详情&#xff1a; Dockerhttps://hub.docker.com/search?qwordpress 具体速度慢的问题如下&#xff1a; 现在打开docker右上角的设置图标&#xff0c;并进入docker engine&#xff0c;添加如下代码&#xff1a; "registry-mirrors&…

贪心算法----摆动序列

今日题目&#xff1a;leetcode376 点击跳转题目 观察样例2&#xff1a; 发现最长摆动序列都是极大值和极小值 再加上两个端点&#xff0c;那么我们保证每次都能选择到每个极值点&#xff0c;就能从局部最优推广全局最优了&#xff01; 但是还有一些细节情况需要注意&#xff…

社工库信息查询

此网站需要注册账号&#xff0c;新用户注册送3点券&#xff0c;每日签到可获得1.5点券。也可通过充值来查 我这里有方法可以利用缺陷来无限获取点券查人

土地档案管理关系参考论文(论文 + 源码)

【免费】javaEE土地档案管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89296786 土地档案管理关系 摘 要 研究土地档案管理关系即为实现一个土地档案管理系统。土地档案管理系统是将现有的历史纸质档案资料进行数字化加工处理&#xff0c;建成标准化的…

LoRa模块学习

什么是LoRa调制 LoRa&#xff08;Long Range&#xff0c;远距离&#xff09;是一种调制技术&#xff0c;与同类技术相比&#xff0c;提供更长的通信距离。调制是基于扩频技术&#xff0c;线性调制扩频&#xff08;CSS&#xff09;的一个变种&#xff0c;具有前向纠错&#xff…

C++数据结构之链表树图的存储

本文主要介绍用数组存储&#xff0c;结构只做简单介绍 目录 文章目录 前言 结构体实现 1、链表的存储 2、树的存储 3、图的存储 数组实现 1、链表实现 2、树和图的实现 总结 前言 在正常工程中&#xff0c;我们通常使用结构体或者类&#xff0c;来定义并使用如链表…

1_1. Linux简介

1_1. Linux简介 文章目录 1_1. Linux简介1. 我们用linux来干嘛2. 计算机组成3. 操作系统4. Linux哲学思想5. Linux目录6. Linux分区类型 1. 我们用linux来干嘛 1. 大家都知道linux是一个操作系统&#xff0c;它是一个基础的软件&#xff0c;操作系统是硬件与应用程序的中间层。…

音频—WAV格式及写入wav文件代码实现

1.RIFF规范 FIFF 是 Resource Interchange File Format&#xff08;资源交换文件格式&#xff09;的简称。RIFF 是一种文件格式规范&#xff0c;用于在计算机系统之间交换和存储多媒体资源。WAV 文件格式是 Microsoft 的 RIFF 规范的一个子集。 RIFF 规则定义了文件的结构和数…

PyQt6--Python桌面开发(7.QTextEdit多行富文本框控件)

QTextEdit多行富文本框控件 保存文件到本地QLine多行文本框.ui import sys import time from PyQt6.QtGui import QValidator,QIntValidator from PyQt6.QtWidgets import QApplication,QLabel,QLineEdit,QTextEdit from PyQt6 import uic,QtGuiif __name__ __main__:appQApp…

视频监控系统中,中心录像服务器的录像文件实际大小和理论值相差很大的问题解决

目录 一、现象描述 二、视频监控的录像文件计算 &#xff08;一&#xff09;计算方法 1、仅视频部分 2、视频和音频部分 3、使用平均码率 &#xff08;二&#xff09;计算工具 1、关注威迪斯特公众号 2、打开“计算容量”的小工具 三、原因分析 &#xff08;一&…

超级好看的html网站维护源码

源码介绍 好看的html网站维护源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c; 源码截图 源码下载 好看的html网站维护源码

Codeforces Round 605 (Div. 3) A~D

本人水平不高&#xff0c;开这个专栏主要是督促自己补题&#xff0c;有些题对目前的我来说还比较难&#xff0c;还补不动&#xff0c;等以后能力上来了再补。。。 原题链接&#xff1a;Dashboard - Codeforces Round 605 (Div. 3) - Codeforces 目录 A. Three Friends B. Sn…

Leedcode题目:移除链表元素

题目&#xff1a; 这个题目就是要我们将我们的链表中的值是val的节点删除。 我们题目提供的接口是 传入了指向一个链表的第一个节点的指针&#xff0c;和我们要删除的元素的值val&#xff0c;不只要删除第一个&#xff0c; 思路 我们这里可以创建一个新的链表&#xff0c;…

第四百九十九回

文章目录 1. 概念介绍2. 使用方法2.1 固定样式2.2 自定义样式 3. 示例代码4. 内容总结 我们在上一章回中介绍了"GetMaterialApp组件"相关的内容&#xff0c;本章回中将介绍使用get显示SnackBar.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在介…

基于Vue3与ElementUI Plus的酷企秀场景可视化DIY设计器探索(更新版)

一、引言 在当今数字化快速发展的时代&#xff0c;企业对于展示自身形象、产品细节以及提升客户体验的需求日益增强。酷企秀场景可视化DIY设计器&#xff0c;以其强大的功能和灵活的定制性&#xff0c;为企业提供了从VR全景展示到地图可视化、电子画册制作等一系列数字化解决方…

实现树莓派DS18B20读取温度(OneWire)

简介 使用的是树莓派3B, Go编程实现OneWire方式读取DS18B20温度。 接线 DS18B20 包含经典三线&#xff0c; VCC和GND自不必说&#xff0c; 主要的是DQ线&#xff0c; 需要接4.7K的上拉电阻&#xff0c; 即4.7K欧姆的电阻接到DQ和VCC&#xff0c; 否则树莓派识别不到DS18B20&am…

Coursera吴恩达深度学习专项课程01: Neural Networks and Deep Learning 学习笔记 Week 04 (完结)

Neural Networks and Deep Learning Course Certificate 本文是学习 https://www.coursera.org/learn/neural-networks-deep-learning 这门课的笔记 Course Intro 文章目录 Neural Networks and Deep LearningWeek 04: Deep Neural NetworksLearning Objectives Deep L-layer…

1分钟搞定Pandas DataFrame创建与索引

1.DataFrame介绍 DataFrame 是一个【表格型】的数据结构,可以看作是【由Series组成的字典】(共用同一个索引)。DataFrame 由按一定顺序排列的多列数据组成。设计初衷是将 Series 的使用场景从一维扩展到多维。DataFrame 既有行索引,也有列索引。 行索引:index 列索引:co…

Cloud Translation 价格

Cloud Translation 价格 您需要按月为 Cloud Translation 处理的内容量付费。您需要支付的具体费用取决于您使用的 API 方法和翻译模型。所列价格以美元 (USD) 为单位。 如果您使用非美元货币付费&#xff0c;请参阅 Cloud Platform SKU 上以您的币种列出的价格。 如需详细了解…