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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10291.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10291.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10291.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kubernetes 上搭建一個 Nginx 的 Pod,并確保傳入的 API 請求被均勻地分發到兩個 Java 業務 Pod 上

目錄 步驟一&#xff1a;創建兩個 Java 業務 Pod步驟二&#xff1a;創建一個 Nginx Pod步驟三&#xff1a;創建一個 Service步驟四&#xff1a;創建一個 Ingress注意事項 要在 Kubernetes 上搭建一個 Nginx 的 Pod&#xff0c;并確保傳入的 API 請求被均勻地分發到兩個 Java 業…

排序算法(Java版)

目錄 1、直接插入排序2、希爾排序3、直接選擇排序4、堆排序5、冒泡排序6、快速排序6.1 遞歸實現6.2 非遞歸實現 7、歸并排序7.1 遞歸實現7.2 非遞歸實現 8、性能分析 今天我們學習一種算法&#xff1a;排序算法&#xff08;本文的排序默認是從小到大順序&#xff09;&#xff0…

C++純C實現貪吃蛇小游戲

公眾號&#xff1a;編程驛站 #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <time.h>//描述蛇的節點信息 typedef struct SnakeNode {int x;int y; } Snode;//箱子&#xff1a;放置蛇的所有節點 Snode snakes[100]; //保存…

滲透思考題

一&#xff0c;嘗試登錄。 客戶端對密碼進行哈希處理并緩存密碼hash&#xff0c;丟棄實際的明文密碼&#xff0c;然后將用戶名發送到服務器&#xff0c;發起認證請求 密文存儲位置&#xff1a;數據庫文件位于C:WindowsSystem32configsam&#xff0c;同時掛載在注冊表中的HKLMSA…

C語言【文件操作 1】

文章目錄 1.為什么使用文件2.文件是什么&#xff1f;2.1程序文件2.2數據文件 3.二進制文件和文本文件4.文件的打開和關閉4.1流和標準流流標準流 4.2文件指針4.3文件的打開和關閉 結語 1.為什么使用文件 很簡單 長久的存儲數據 如果沒有文件&#xff0c;我們寫程序所產生的數據…

商米-android-使用NFC讀IC卡,身份證云解和IC卡同時兼容

商米介紹地址&#xff1a;https://www.sunmi.com/ 商米是一個提供手持PDA的一個很好的解決方案廠商&#xff0c; 也有其他的一些桌面設備。 其中商米提供的軟件服務中&#xff0c;比較特別的是 身份證云解功能。 此處重點說明一下&#xff0c;身份證云解功能。 以往市面上的身…

Vue學習JSON.stringify()將Object類型轉換成String類型

Vue學習JSON.stringify&#xff08;&#xff09;將Object類型轉換成String類型 一、前言1、基本用法2、復雜對象轉換3、過濾器函數4、序列化函數 一、前言 JSON.stringify() 是一個 JavaScript 函數&#xff0c;用于將 JavaScript 值轉換為 JSON 字符串。它接受一個 JavaScrip…

深入探索MySQL視圖

前言 在數據庫的世界里&#xff0c;MySQL視圖作為數據抽象的一把利劍&#xff0c;為我們提供了一種靈活而高效的方式來管理和查詢數據。它不僅能夠簡化復雜的查詢邏輯&#xff0c;還能在不改動底層數據結構的前提下&#xff0c;實現數據的定制化展示與訪問控制。本文旨在深入解…

【小紅書采集工具】根據搜索關鍵詞批量采集小紅書筆記,含筆記正文、筆記鏈接、發布時間、轉評贊藏等

一、背景介紹 1.1 爬取目標 熟悉我的小伙伴都了解&#xff0c;我之前開發過2款軟件&#xff1a; 【GUI軟件】小紅書搜索結果批量采集&#xff0c;支持多個關鍵詞同時抓取&#xff01; 【GUI軟件】小紅書詳情數據批量采集&#xff0c;含筆記內容、轉評贊藏等&#xff0c;支持…

【C++】string類的使用①(默認成員函數 || 迭代器接口begin,end,rbegin和rend)

&#x1f525;個人主頁&#xff1a; Forcible Bug Maker &#x1f525;專欄&#xff1a; STL || C 目錄 前言&#x1f308;關于string類&#x1f308;string類的成員函數&#x1f525;默認成員函數string類對象的構造(constructor)string類對象的析構string類對象的賦值運算符…

NPOI生成word浮動圖標

1、NPOI版本2.7.0, net框架4.8 2、安裝OpenXMLSDKToolV25.msi 3、先創建一個word文檔&#xff0c;并設置圖片為浮于文字之上 4、OpenXML顯示的結果 5、實際代碼如下&#xff1a; public class GenerateWordDemo {public GenerateWordDemo(){}//https://blog.fileformat.co…

js由那三部分組成

JavaScript 主要由三部分組成&#xff1a;ECMAScript、DOM&#xff08;文檔對象模型&#xff09;和 BOM&#xff08;瀏覽器對象模型&#xff09;。 1、ECMAScript ECMAScript 是 JavaScript 的核心&#xff0c;描述了語言的基本語法&#xff08;變量、函數、條件語句、循環、…

前端筆記-day03

文章目錄 01-初始CSS02-CSS引入方式03-標簽選擇器04-類選擇器05-id選擇器06-通配符選擇器07-畫盒子08-字體大小09-文字粗細10-字體傾斜11-行高12-行高垂直居中13-字體族14-font復合屬性15-文本縮進16-文本對齊方式17-圖片對齊方式18-文本修飾線19-文字顏色20-調試工具21-綜合案…

Dual Aggregation Transformer for Image Super-Resolution論文總結

題目&#xff1a;Dual Aggregation Transformer&#xff08;雙聚合Transformer&#xff09; for Image Super-Resolution&#xff08;圖像超分辨&#xff09; 論文&#xff08;ICCV&#xff09;&#xff1a;Chen_Dual_Aggregation_Transformer_for_Image_Super-Resolution_ICCV…

IM 是什么?

在當今數字化的時代&#xff0c;即時通訊&#xff08;IM&#xff09;已經滲透到人們的日常生活和企業的工作環境中。IM技術的快速i發展為人們提供了一種高效、便捷的溝通方式&#xff0c;不僅推動了社會的信息化進程&#xff0c;也提升了企業的協同效率和競爭力。 作為企業級I…

【GD32】01-GPIO通用輸入輸出

GD32 閑話說在前頭 這里又開一個系列啦。 原因就是之前買了立創開發板的9.9的GD32E230C8T6的板子&#xff0c;買都買了就跟著立創開發板學習一下&#xff08;屬于是一次性支持了兩個國產品牌了&#xff0c;立創和兆易創新&#xff09;。并且我還買了GD32F407VET6的板子&…

資金流分析下的企業供貨關系強度模型

圖技術 利用neo4j、networkx、dgl、python做圖分析挖掘 【1】最短路徑算法dijkstra 【2】基于networkx的隱性集團關系識別模型 【3】基于Neo4j的擔保社群型態分析挖掘 【4】基于python求有向無環圖中target到其他節點全路徑 【5】有向圖中任意兩點的路徑 【6】圖基礎入門 【7】…

項目管理中控制質量的工具與技術

項目管理中控制質量的工具與技術 控制質量的工具與技術包括多種方法&#xff0c;旨在確保產品或服務達到既定的質量標準。關于具體的工具格式和樣式&#xff0c;以下是一些示例&#xff1a; 統計技術&#xff1a; 這是一種將質量控制要素的數據轉化為實際控制手段的技術。通…

Visual Studio和Visual Studio Code適用于哪些編程語言

Visual Studio和Visual Studio Code都適用于多種編程語言&#xff0c;它們的適用編程語言如下&#xff1a; Visual Studio適用于&#xff1a; C#Visual Basic .NETF#CJavaScriptTypeScriptPythonHTML/CSSJava&#xff08;通過插件支持&#xff09; Visual Studio Code適用于…

Jtti:哪些方法可以降低美國CN2服務器的延遲?

降低美國CN2服務器的延遲可以采取多種方法&#xff0c;以下是一些常用的方法&#xff1a; 1.選擇優質的網絡提供商和服務商&#xff1a;選擇具有高質量網絡和優質服務的網絡提供商和服務商是降低延遲的關鍵。確保您選擇的網絡提供商具有可靠的基礎設施和優質的網絡連接&#xf…