【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图片的详细信息如下图所示:

相关文章:
【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片
【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片 1.背景2.接口 1.背景 System.Drawing.Common 是一个用于图像处理和图形操作的库,它是 System.Drawing 命名空间的一部分。由于 .NET Core 和 .NET 5 的跨平台特性,许多以前内置于 .NET Framework…...
Bug:Linux用户拥有r权限但无法打开文件【Linux权限体系】
Bug:Linux用户拥有r权限但无法打开文件【Linux权限体系】 0 问题描述&解决 问题描述: 通过go编写了一个程序,产生的/var/log/xx日志文件发现普通用户无权限打开 - 查看文件权限发现该文件所有者、所有者组、其他用户均有r权限 - 查看该日…...
【Redis】Widows 和 Linux 下使用 Redis
Redis 简述 1.缓存 缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,现代 CPU 越来越快的一个重要因素就是使用了更多的缓存,在复杂的软件设计中,缓存几乎无处不在。大型网站架构设计在很多方面都使用了缓存设计。 2.Redis Redis …...
统计计算四|蒙特卡罗方法(Monte Carlo Method)
系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法(Expectation-Maximization Algorithm,期望最大化算法) 统计计算三|Cases for EM 文章目录 系列文章目录一、基本概念(一)估算 π \pi π(二&…...
大模型时代的具身智能系列专题(三)
清华高阳团队 高阳为清华叉院助理教授,本科毕业于清华大学计算机系,博士毕业于UC Berkeley。博士导师是Vision领域的大牛Trevor Darrell,读博期间和Sergey Levine合作开始强化学习方面的探索,博后跟随Pieter Abbeel做强化学习&am…...
使用 FileZilla 在 Windows 和 Ubuntu 之间传文件
网线一端插在板子的WAN口上,另一段插在电脑上,然后要配一下板子的IP。 板侧: 使用串口链接板子与PC端; 输入指令 ifconfig eth0(具体看wan口对应哪一个) 192.168.1.99 PC端配置: 打开网络设…...
【C++初阶】—— 类和对象 (上)
📝个人主页🌹:EterNity_TiMe_ ⏩收录专栏⏪:C “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 类和对象 1. 初步认识C2. 类的引入3. 类的定义声明和定义全部放在类体中声明和定义分开存放 4.…...
基础—SQL—图形化界面工具的DataGrip使用(2)
一、回顾与引言 (1) 上次内容,博客讲到了DDL语句的数据库操作、表操作、表字段的操作的相关语法,然而之前都是在MySQL的命令行当中去操作演示的。这种方式可以用,但是使用的话,第一,在我们日常…...
4-主窗口
4-主窗口 1、简介2 菜单栏、工具栏、状态栏2.1 菜单栏2.2 QAction2.3 工具栏2.4 状态栏 3 混合方式UI设计 1、简介 QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件,是许多应用程序&…...
四川景源畅信:抖音小店新手如何做?
随着短视频平台的兴起,抖音小店成为了许多创业者的新选择。但是,对于新手来说,如何在抖音上开设并经营好自己的小店呢?本文将围绕这一问题展开讨论。 一、明确目标和定位作为抖音小店的新手,首先要明确自己的经营目标和定位。是想…...
EventSource
什么是EventSource EventSource 是一个用于服务器推送事件(Server-Sent Events, SSE)的接口,它允许服务器推送实时更新到浏览器。与 WebSocket 不同,SSE 是单向的(服务器到客户端),适用于更新频…...
Vue2 Element-UI 分页组件el-pagination 修改 自带的total、跳转等默认文字
场景需求: Vue2 Element-UI 分页组件el-pagination 修改 自带的total、跳转等默认文字。如下图:默认提示字变成了英文,如何将其 变成 汉字提示呢? 解决方案: 1.方案1:修改DOM内容 不提倡此方案…...
【简单介绍下线性回归模型】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
有限元法之有限元空间的构造
目录 一、区域Ω的剖分 二、三角形一次元 三、一次元的基函数与面积坐标 四、三角形二次元及其基函数 前两节我们介绍了有限元基本概念和变分理论的推导,本节我们继续探讨有限元空间的构造。 一、区域Ω的剖分 对矩形区域进行三角剖分,其中x方向剖…...
高通车规芯片分析
高通三款芯片 SA8155P 7nm SA8295P 5nm SA8255P 5nm 分析AECQ等级 AECQ100里面定义了5个工作环境温度等级:Grade0:-40-150 Grade1:-40-125 Grade2:-40-105 Grade3:-40-85 Grade4:0-70AEC-Q100整体认证测试…...
Flutter 中的 TextButton 小部件:全面指南
Flutter 中的 TextButton 小部件:全面指南 在Flutter的世界里,TextButton是一个基础的小部件,用于创建只包含文本的按钮。它通常用于对话框、表单以及需要强调主要操作的界面。本文将为您提供一个全面的指南,帮助您了解如何使用T…...
通过键值对访问字典
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中,如果想将字典的内容输出也比较简单,可以直接使用print()函数。例如,要想打印dictionary字典ÿ…...
海外仓扫码管理系统怎么选?精准,高效管理需求才是核心需求
海外仓对那些想拓展国际市场的商家来说还是非常重要的,大部分的货物都需要先运到海外仓,才能继续进行下一步的物流快递发货。 那对于海外仓本身来说,当面临大量订单的时候,怎么快速的管理订单,拣选货物就变得十分重要…...
基于51单片机的智能灯光控制系统
一.硬件方案 智能灯光控制系统由单片机最小系统、人体感应模块、关照强度模块、灯光控制模块、电源模块和灯泡组成。本文以STC89C52单片机为核心,通过利用光照度和红外人体感应相结合主动与被动的探测方法,现了室内无人或者关照充足时灯光自动光灯&…...
测试开发面试题
简述自动化测试的三大等待 强制等待。直接使用time.sleep()方法让程序暂停指定的时间。优点是实现简单,缺点是不够灵活,可能会导致不必要的等待时间浪费。隐式等待。设置一个固定的等待时间,在这个时间内不断尝试去查找元素,如果…...
大模型领域岗位梯队详解:小白程序员转型宝典,速收藏![特殊字符]
大模型领域岗位梯队详解:小白程序员转型宝典,速收藏!🔥 本文详细解析了大模型领域的岗位梯队,从底层架构到应用开发,涵盖了预训练、基础设施、模型优化、后训练、多模态等多个方向。文章强调了当前大模型领…...
无人机数据分析:UAV Log Viewer 技术解析与实践指南
无人机数据分析:UAV Log Viewer 技术解析与实践指南 【免费下载链接】UAVLogViewer An online viewer for UAV log files 项目地址: https://gitcode.com/gh_mirrors/ua/UAVLogViewer 无人机数据分析是提升飞行安全性和任务效率的关键环节。UAV Log Viewer作…...
浏览器资源嗅探技术深度解析:如何高效捕获网页媒体资源
浏览器资源嗅探技术深度解析:如何高效捕获网页媒体资源 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今多媒体内容爆炸式增长的时…...
每日一道面试题 08:SpringBoot 自动配置原理
一、核心前提SpringBoot 核心优势:自动配置,无需手动编写大量 XML 配置,简化开发(本质是 “约定优于配置”)自动配置底层依赖:EnableAutoConfiguration 注解 Spring 工厂加载机制 条件注解核心目标&#…...
重磅更新!Pydantic AI 引入在线 Eval 与 MCP 控制,Agent 落地难的问题正在被解决
Agent 开发进入“深水区”:pydantic-ai v1.74.0 释放了什么信号?在 AI 应用开发的圈子里,一直存在一个尴尬的现象:写一个能跑的 Chatbot Demo 只需要一下午,但要把这个 Demo 变成稳定可靠的生产级应用,可能…...
避坑指南:OpenClaw安装Qwen3-4B镜像的5大常见错误
避坑指南:OpenClaw安装Qwen3-4B镜像的5大常见错误 1. 为什么需要这份避坑指南 上周我在本地部署OpenClaw对接Qwen3-4B镜像时,连续踩了三个坑:先是npm版本冲突导致安装失败,接着模型地址格式写错导致连接超时,最后又遇…...
【架构实战】读写分离中间件对比(ShardingSphere/MyCat)
一、为什么需要读写分离 在大多数互联网应用中,读操作远多于写操作: 读请求:70-80% 写请求:20-30%单机数据库的问题: 主库:处理所有写请求 部分读请求↓ 连接池耗尽 → 响应变慢 → 用户投诉解决方案&a…...
SEO创始人有哪些著名的代表人物
SEO创始人有哪些著名的代表人物? 在互联网时代,搜索引擎优化(SEO)已经成为数字营销中不可或缺的一部分。无论是小型企业还是大型跨国公司,都在通过SEO提升网站在搜索引擎结果页面的排名,从而获得更多的流量…...
ModTheSpire终极指南:深度解析杀戮尖塔模组加载器的技术实现与高级配置
ModTheSpire终极指南:深度解析杀戮尖塔模组加载器的技术实现与高级配置 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 你是否曾经想过,为什么同样的《杀戮尖塔…...
一些常见颜色汇总
1 1.1 CVPR2024:Koala序号示例RGBHEX1(244, 204, 204)#F4CCCC2(207, 226, 243)#CFE2F33(252, 229, 205)#FCE5CD序号示例RGBHEX1(217,217,217)#D9D9D92(252,229,205)#FCE5CD 2 2.1 AAAI2025:Stable Mean Teacher for Semi-supervised Video Action Detection序号示例…...
