Tiff文件解析和PackBits解压缩

news2025/1/10 22:25:01

实现了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布局,效果如下

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

618洗地机推荐,市面上各式各样的洗地机怎么选?这里有答案

洗地机的出现极大地改变了清洁方式&#xff0c;通过结合扫地、拖地、吸尘等多种功能&#xff0c;实现了一机多用的便捷清洁体验。而且洗地机不需要弯腰&#xff0c;每次也不用清洁很长时间&#xff0c;节省出来的时间可以更好的休息&#xff0c;但是市面上各式各样的洗地机怎么…

突破编程界限:探索AI编程新境界

文章目录 一、AI编程助手1.1 Baidu Comate智能代码助手1.2 阿里云 通义灵码 二、场景需求三、体验步骤3.1 官网下载3.2 手动下载 四、试用感受4.1 提示4.2 注释生成代码4.3 代码生成4.4 选中生成注释4.5 查看变更&新建文件4.6 调优建议4.7 插件使用 五、结尾推荐 一、AI编程…

代码审计-php篇之某CRM系统多处sql注入

&#x1f31f; ❤️ 作者&#xff1a;yueji0j1anke 首发于公号&#xff1a;剑客古月的安全屋 字数&#xff1a;3516 阅读时间: 35min 声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果…

Python爬虫 【1】 —— 爬虫基础

爬虫基本套路 基本流程 目标数据来源地址结构分析 具体数据在哪&#xff08;网站 还是APP&#xff09;如何展示的数据、 实现构思操刀编码 基本手段 破解请求限制 请求头设置&#xff0c;如&#xff1a;useragent为有效客户端控制请求频率&#xff08;根据实际情境&#xff09…

在Linux上安装并运行RabbitMQ

目录 准备CentOS服务器 下载rabbit-server和erlang文件 启动RabbitMQ服务 准备CentOS服务器 两个命令&#xff0c;选一个能用的&#xff0c;查看CentOS服务器的版本 lsb_release -a下载rabbit-server和erlang文件 参考文章&#xff1a;http://t.csdnimg.cn/t8BbM 1、创建新…

龟兔赛跑(基于GUI与多线程实现)

直击龟兔赛跑现场 下面这张图是我们设计龟兔赛跑界面的初始效果与基本组成结构&#xff1a; 接下来是我仅代表我个人提出的一些疑问与解答&#xff1a; 1、俩动物以图片的形式显示&#xff1f; 其实在这里两个动物类就像标签一样 标签组件是什么&#xff1f;用于短文本字符串…

对话易参创始人黄怡然:股权能不能赋能企业增长?| 极新企服直播实录

“ 致所有爱画饼的老板 ” 整理 | 云舒 编辑 | 小白 出品&#xff5c;极新 2022年以前&#xff0c;股权激励作为企业实现增长、吸引人才、保留人才并大幅度激发人才价值的重要手段&#xff0c;几乎成为每一个企业的标配。但是&#xff0c;现在这个时代&#xff0c;股权激励几…

2024年最新方法下载钉钉群直播回放

链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好所有的压缩包&#xff0c;这个压缩包里面还套着一共逍遥一仙下载器压缩包&#xff0c;也解压 2.进入逍遥一仙下载器文件夹&#xff0c;打开M3U8 V1.4.8 0508.e…

ESP32-C3-MINI-1

https://www.espressif.com.cn/sites/default/files/documentation/esp32-c3-mini-1_datasheet_cn.pdf 芯片 https://files.seeedstudio.com/wiki/XIAO_WiFi/Resources/esp32-c3_datasheet.pdf 结果参考&#xff1a; https://blog.csdn.net/iamxxdd/article/details/12386419…

【回溯算法】【Python实现】最大团问题

文章目录 [toc]问题描述回溯算法Python实现时间复杂性 问题描述 给定无向图 G ( V , E ) G (V , E) G(V,E)&#xff0c;如果 U ⊆ V U \subseteq V U⊆V&#xff0c;且对任意 u u u&#xff0c; v ∈ U v \in U v∈U有 ( u , v ) ∈ E (u , v) \in E (u,v)∈E&#xff0c;则称…

XMind 2021 v11.1.2软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; XMind 2021 v11.1.2被誉为顶尖思维导图工具&#xff0c;以其简洁、整洁的界面和直观的功能布局脱颖而出。尽管软件体积小巧&#xff0c;却极具强大功…

【小红书采集软件】根据关键词批量爬取小红书笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴可能了解&#xff0c;我之前开发过2款软件&#xff1a; 【GUI软件】小红书搜索结果批量采集&#xff0c;支持多个关键词同时抓取&#xff01; 【GUI软件】小红书详情数据批量采集&#xff0c;含笔记内容、转评赞藏等&#xff0c;支…

【初阶数据结构】单链表基础OJ题讲解

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL。 &#x1f4da;本文收录与初阶数据结构系列&#xff0c;本专栏主要是针对时间、空间复杂度&#xff0c;顺序表和链表、栈和队列、二叉树以及各类排序算法&#xff0c;持…

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…

智能家居2 -- 实现网络控制模块

这一模块的思路和前面的语言控制模块很相似&#xff0c;差别只是调用TCP 去控制 废话少说&#xff0c;放码过来 增添/修改代码 socket_interface.c #include <pthread.h>#include "socket_interface.h" #include "control.h" #include "socke…

3分钟掌握Suno API!音痴也能创作热门曲!免费拥有个人爆款音乐!

Suno API 的申请及使用 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的音乐。 Suno 是一个专业高质量的 AI 歌曲和音乐创…

系统代理开启时,钉钉页面加载失败等问题处理

若Windows端钉钉点击工作台/文件提示“页面加载失败”&#xff0c;可先将钉钉升级到7.1.10及以上版本&#xff1b;若依旧报错&#xff0c;可通过以下方法操作&#xff1a; 1、【电脑端钉钉】-【登录页面】-【切换到密码登录页面】-【网络设置】-切换为【不使用代理】&#xff…

示例七、超声波传感器测距

通过以下几个示例来具体展开学习,了解超声波传感器原理及特性&#xff0c;学习超声波传感器的应用&#xff1a; 示例七、超声波传感器测距 一、基本原理&#xff1a; 1、超声波测距仪的系统结构 利用超声测距原理测量物体之间的距离&#xff0c;当此距离小于某一设定值时&…

如何查看打包后的jar包启动方法main方法

背景 有时候我们在引用一个jar包的时候,想查看一个jar包的结构,这时候查看启动类就比较重要,因为一些关键配置是在启动类上的,这里教大家如何查看这个启动类(springboot项目) 步骤 首先打开jar包预览结构,可以使用解压缩工具直接双击打开或者预览结构 打开路径 META-INF/MA…

RabbitMQ(安装配置以及与SpringBoot整合)

文章目录 1.基本介绍2.Linux下安装配置RabbitMQ1.安装erlang环境1.将文件上传到/opt目录下2.进入/opt目录下&#xff0c;然后安装 2.安装RabbitMQ1.进入/opt目录&#xff0c;安装所需依赖2.安装MQ 3.基本配置1.启动MQ2.查看MQ状态3.安装web管理插件4.安装web管理插件超时的解决…