【CSharp】將ushort數組保存為1通道位深16bit的Tiff圖片

【CSharp】將ushort數組保存為1通道位深16bit的Tiff圖片

  • 1.背景
  • 2.接口

1.背景

System.Drawing.Common 是一個用于圖像處理和圖形操作的庫,它是 System.Drawing 命名空間的一部分。由于 .NET Core 和 .NET 5+ 的跨平臺特性,許多以前內置于 .NET Framework 中的庫被移到了獨立的NuGet包中,以便更好地管理和跨平臺使用。

System.Drawing.Common 提供了處理圖像的基礎設施,包括創建、修改和保存圖像的功能。
在使用與圖像相關的類(如 Bitmap 和 Graphics)時,需要引用這個包。

通過 NuGet 包管理器安裝:System.Drawing.Common
如下圖所示:
在這里插入圖片描述
安裝完成后,將在項目下的packages目錄下生成System.Drawing.Common.8.0.5文件夾,如下圖:
在這里插入圖片描述

使用如下代碼創建16位深的Tiff圖:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;namespace Raw2Tiff
{class jn10010537{static void Main(){// 示例 ushort 數組int width = 100;int height = 100;ushort[] ushortArray = new ushort[width * height];Random random = new Random();for (int i = 0; i < ushortArray.Length; i++){ushortArray[i] = (ushort)random.Next(0, 65536);}// 將 ushort 數組轉換為 byte 數組byte[] byteArray = new byte[ushortArray.Length * 2];Buffer.BlockCopy(ushortArray, 0, byteArray, 0, byteArray.Length);// 創建 Bitmap 對象Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format16bppGrayScale);// 獲取 BitmapData 對象// 使用LockBits方法可以更快地設置像素,該方法允許您將托管數據快速封送到非托管位圖字節。BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, bitmap.PixelFormat);// 將 byte 數組拷貝到 BitmapData 對象Marshal.Copy(byteArray, 0, bitmapData.Scan0, byteArray.Length);// 解鎖 BitmapData 對象bitmap.UnlockBits(bitmapData);// 保存為 TIFF 圖片bitmap.Save("output.tiff", ImageFormat.Tiff);Console.WriteLine("圖片已保存為 output.tiff");}}
}

運行如下:
在這里插入圖片描述

原因:請注意,GDI+似乎不支持16bpp灰度,這意味著。net無法將16bpp灰度位圖保存到文件或流中。

2.接口

在Windows上使用System.Drawing.Common處理16位灰度圖像保存為TIFF時,目前(2024-05-27)會遇到問題!
因為默認情況下System.Drawing庫不直接支持16位灰度圖像的處理。

本博客采用的替代解決方案是使用BitMiracle.LibTiff.NET庫,這是一個強大的庫,專門用于處理TIFF圖像格式。

通過 NuGet 包管理器安裝: BitMiracle.LibTiff.NET 包,
如下圖:
在這里插入圖片描述
安裝日志:

正在嘗試收集與目標為“.NETFramework,Version=v4.7.2”的項目“Raw2Tiff”有關的包“BitMiracle.LibTiff.NET.2.4.649”的依賴項信息
收集依賴項信息花費時間 665 ms
正在嘗試解析程序包“BitMiracle.LibTiff.NET.2.4.649”的依賴項,DependencyBehavior 為“Lowest”
解析依賴項信息花費時間 0 ms
正在解析操作以安裝程序包“BitMiracle.LibTiff.NET.2.4.649”
已解析操作以安裝程序包“BitMiracle.LibTiff.NET.2.4.649”GET https://api.nuget.org/v3-flatcontainer/bitmiracle.libtiff.net/2.4.649/bitmiracle.libtiff.net.2.4.649.nupkgOK https://api.nuget.org/v3-flatcontainer/bitmiracle.libtiff.net/2.4.649/bitmiracle.libtiff.net.2.4.649.nupkg 172 毫秒
已通過內容哈希 XCEdfCphKo0UAvSg1h/OzOFWtjkIGnPMAziYkNqV7NVrqb/tZJTBxJhxIEX7gpvQwg8GIRYt133SUncfkKfjLA== 從 https://api.nuget.org/v3/index.json 安裝 BitMiracle.LibTiff.NET 2.4.649 。
正在將包“BitMiracle.LibTiff.NET.2.4.649”添加到文件夾“C:\Users\Administrator\Desktop\IRay_CSahep\Raw2Tiff\packages”
已將包“BitMiracle.LibTiff.NET.2.4.649”添加到文件夾“C:\Users\Administrator\Desktop\IRay_CSahep\Raw2Tiff\packages”
已將包“BitMiracle.LibTiff.NET.2.4.649”添加到“packages.config”
已將“BitMiracle.LibTiff.NET 2.4.649”成功安裝到 Raw2Tiff
執行 nuget 操作花費時間 2.52 sec
已用時間: 00:00:03.3026348
========== 已完成 ==========

安裝完成將在項目文件目錄下生成"BitMiracle.LibTiff.NET.2.4.649"文件夾,如下圖:
在這里插入圖片描述

以下是使用BitMiracle.LibTiff.NET保存16位灰度TIFF圖像的示例代碼:

using System;
using BitMiracle.LibTiff.Classic;namespace Raw2Tiff
{class jn10010537{static void Main(){// 示例 ushort 數組int width = 300;int height = 500;ushort[] ushortArray = new ushort[width * height];Random random = new Random();for (int i = 0; i < ushortArray.Length; i++){ushortArray[i] = (ushort)random.Next(0, 65536);}// 保存為 TIFF 圖片Save16BitGrayscaleTiff("jn10010537.tiff", ushortArray, width, height);Console.WriteLine("圖片已保存成功!");Console.ReadKey();}private static void Save16BitGrayscaleTiff(string fileName, ushort[] imageData, int width, int height){using (Tiff output = Tiff.Open(fileName, "w")){output.SetField(TiffTag.IMAGEWIDTH, width);output.SetField(TiffTag.IMAGELENGTH, height);output.SetField(TiffTag.SAMPLESPERPIXEL, 1);output.SetField(TiffTag.BITSPERSAMPLE, 16);output.SetField(TiffTag.ORIENTATION, Orientation.TOPLEFT);output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);output.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK);output.SetField(TiffTag.ROWSPERSTRIP, height);int stride = width * sizeof(ushort);byte[] strip = new byte[stride];for (int row = 0; row < height; row++){Buffer.BlockCopy(imageData, row * stride, strip, 0, stride);output.WriteScanline(strip, row);}}}}
}

程序運行后將生成tiff文件,打開Tiff圖片的詳細信息如下圖所示:
在這里插入圖片描述

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

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

相關文章

基于Fluent和深度學習算法驅動的流體力學計算與應用

“基于Fluent和深度學習算法驅動的流體力學計算與應用”專題大綱 目錄 主要內容 機器學習與流體力學入門 一、流體力學基礎理論與編程實戰1、流體力學的發展概述 2、不可壓縮流體力學的基本方程 3、湍流理論與湍流模型簡介 4、傅里葉變換和流體的尺度分析 5、偽譜法求解不可壓…

Vue小程序項目知識積累(二)

1.wx.reLaunch(Object object) 關閉所有頁面&#xff0c;打開到應用內的某個頁面。 wx.reLaunch({url:/pages/positons/index}) 參數說明&#xff1a; 屬性類型默認值必填說明urlstring是需要跳轉的應用內頁面路徑 (代碼包路徑)&#xff0c;路徑后可以帶參數。參數與路徑之…

微信小程序上傳包過大的最全解決方案!

微信小程序的發布大小限制是2MB。然而一個程序怎么能這么小&#xff1f; 介紹一下項目中的經驗。 新項目 如果是剛開始做的新項目&#xff0c;一定確定好自己要用的Ui框架&#xff0c;而且確定之后&#xff0c;千萬不要引入別的&#xff0c;否則占大小&#xff01;&#xff0…

HNCTF

HNCTF 文章目錄 HNCTFBabyPQEZmathez_Classicf(?*?)MatrixRSABabyAESIs this Iso? BabyPQ nc簽到題&#xff0c;跟端口連接拿到n和phin n 8336450100232098099043686671148282601664696810002345240872579498695511770993195704402414029892029461830476866385453475141207…

【開源】加油站管理系統 JAVA+Vue.js+SpringBoot+MySQL

目錄 一、項目介紹 論壇模塊 加油站模塊 汽油模塊 二、項目截圖 三、核心代碼 一、項目介紹 Vue.jsSpringBoot前后端分離新手入門項目《加油站管理系統》&#xff0c;包括論壇模塊、加油站模塊、汽油模塊、加油模塊和部門角色菜單模塊&#xff0c;項目編號T003。 【開源…

如何使用jQuery重定向到另一個網頁

在我們開始討論如何重定向到另一個網頁之前,必須明確一點:jQuery 是一個用于 DOM 操作的 JavaScript 庫,因此你不應該使用 jQuery 來實現頁面重定向。 jQuery 官方網站的某段話: 雖然 jQuery 可能能夠在較舊的瀏覽器版本中運行,但我們并沒有主動在這些版本中進行測試,也…

矩陣對角化在機器學習中的奧秘與應用

在機器學習的廣闊領域中&#xff0c;矩陣對角化作為一種重要的數學工具&#xff0c;扮演著不可或缺的角色。從基礎的線性代數理論到復雜的機器學習算法&#xff0c;矩陣對角化都在其中發揮著重要的作用。 矩陣對角化的概念與原理 矩陣對角化是矩陣理論中的一個基本概念&#x…

vue.config.js配置參考(2024-05-20)

vue.config.js 是一個可選的配置文件&#xff0c;如果項目的 (和 package.json 同級的) 根目錄中存在這個文件&#xff0c;那么它會被 vue/cli-service 自動加載。 你也可以使用 package.json 中的 vue 字段&#xff0c;但是注意這種寫法需要你嚴格遵照 JSON 的格式來寫。 這…

綜合布線管理軟件有何作用?

當客戶問及“綜合布線管理軟件究竟有何作用&#xff1f;” 我們通常這樣回答&#xff1a; 綜合布線管理軟件&#xff0c;作為運維管理的得力助手&#xff0c;其核心功能旨在確保布線系統的穩定運行與快速響應。 首先&#xff0c;這款軟件通過構建標準化的運維管理流程&#…

Qt for Android

文章 USB Qt for android 獲取USB設備列表&#xff08;一&#xff09;Java方式 獲取 Qt for android 獲取USB設備列表&#xff08;二&#xff09;JNI方式 獲取 Qt for android 串口庫使用 異常處理 Qt for Android 亂碼問題 andoid開發文檔 UsbManager&#xff08;apiref.…

四川匯聚榮科技有限公司好不好?

在當今科技飛速發展的時代&#xff0c;企業要想在激烈的市場競爭中脫穎而出&#xff0c;不僅需要先進的技術支持&#xff0c;還需要優質的服務和良好的口碑。那么&#xff0c;四川匯聚榮科技有限公司是否具備這些條件呢?接下來&#xff0c;我們將從公司實力、服務質量、客戶反…

win10換ubuntu

1.首先是格式化windows系統&#xff0c;這里用的是恢復出廠設置 2.然后按照下面教程使用u盤來安裝ubuntuUbuntu 20.04.2.0 LTS 系統安裝過程詳解 &#xff08;從下載鏡像到安裝系統&#xff09;_ubuntu安裝教程20.04-CSDN博客 3.然后下面是一些別的準備工作&#xff1a; 1)安…

如何根據系統的業務場景需求定制自己的線程池?

如何根據系統的業務場景需求定制自己的線程池? 1、背景2、生產中應當如何使用線程池才比較合理呢?2.1、指定線程數量2.2、選擇合適的工作隊列2.3、自定義線程工廠2.4、選擇合適的拒絕策略3、自定義線程池代碼案例1、背景 線程池有那么多的參數和類型,在實際的開發中,我們應…

達夢授權某個模式給其它用戶只讀權限

為了在生產環境中將SZSJTJFX模式下的所有對象的只讀權限授予XXXX的賬號SZJG_CPZLJD&#xff0c;可以通過以下分批處理的腳本來完成。此腳本會遍歷SZSJTJFX模式下的所有表和視圖&#xff0c;并生成相應的GRANT語句&#xff0c;以避免“過多的對象名前綴”錯誤。 分批處理的動態…

Python基礎內容---上萬字總結(回顧自己一年來所有關于python的學習)

Python語言元素之變量 作為一個程序員,可能經常會被外行問到兩個問題,其一是“什么是(計算機)程序”,其二是“寫(計算機)程序能做什么”,這里我先對這兩個問題做一個回答。程序是指令的集合,寫程序就是用指令控制計算機做我們想讓它做的事情。那么,為什么要用Python…

Java后端面經

1.可重復讀&#xff0c;已提交讀&#xff0c;這兩個隔離級別表現的現象是什么&#xff0c;區別是什么樣的&#xff1f; 可重復讀&#xff1a;表示整個事務看到的事務和開啟后的事務能看到的數據是一致的&#xff0c;既然數據是一致的&#xff0c;所以不存在不可重復讀。而且不…

kafka調優參考建議 —— 筑夢之路

這里主要是從不同使用場景來調優&#xff0c;僅供參考。 吞吐量優先 吞吐量優先使用場景如采集日志。 1. broker配置調優 num.partitions&#xff1a;分區個數&#xff0c;設置為與消費者的線程數基本相等 2. producer配置調優 batch.size 批量提交消息的字節數&#xff0c;…

力扣算法之1045. 買下所有產品的客戶

力扣傳送門 題解注釋 Customer表中對應的customer_id對應的product_key去重后要全部存在于Product表中的product_key 我的解 SELECT customer_id FROM Customer GROUP BY customer_id HAVING COUNT(DISTINCT product_key)(SELECT COUNT(DISTINCT product_key) FROM Product…

《java數據結構》--順序表詳解

一.順序表的概念&#x1f649; &#x1f431;順序表是一段物理地址連續的儲存單元&#xff0c;一次儲存數據元素的線性結構。一般情況下采用數組儲存&#xff0c;和數組的增刪查改類似。 但是順序表和數組還是有區別的比如&#xff0c;數組按照是否可以擴容可以分為&#xff…

duckdb 插件機制研究

本文研究 duckdb 內置的 extensions 工作機制。 插件架構 在 duckdb 源碼內&#xff0c;內置了一組原生插件&#xff0c;位于頂層 extension 目錄下&#xff1a; 除此之外&#xff0c;還支持 Out-of-Tree Extension&#xff0c;簡單說就是獨立的插件&#xff0c;不是集成在源…