将多个多页 tiff 图像合并为单个 tiff C#

2023-12-30

在我的场景中,我有 3 个或更多多页 tiff 图像,我需要将它们合并为单个 tiff 图像。

下面是我尝试过的代码。它合并到单个 tiff 图像中,但仅与所有 tiff 图像的第一页合并。

private static void MergeTiff(string[] sourceFiles)
{
    string[] sa = sourceFiles;
    //get the codec for tiff files
    ImageCodecInfo info = null;
    foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders())
        if (ice.MimeType == "image/tiff")
            info = ice;

    //use the save encoder
    Encoder enc = Encoder.SaveFlag;

    EncoderParameters ep = new EncoderParameters(1);
    ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);

    Bitmap pages = null;

    int frame = 0;

    foreach (string s in sa)
    {
        if (frame == 0)
        {
            MemoryStream ms = new MemoryStream(File.ReadAllBytes(Path.Combine(Environment.CurrentDirectory, @"C:\Data_Warehouse\SVNRepository\CD.BNS.W5555.LT45555C.D180306.T113850.Z0101\", s)));
            pages = (Bitmap)Image.FromStream(ms);

            var appDataPath = @"C:\Data_Warehouse\SVNRepository\Tiffiles\";
            var filePath = Path.Combine(appDataPath, Path.GetRandomFileName() + ".tif");

            //save the first frame
            pages.Save(filePath, info, ep);
        }
        else
        {
            //save the intermediate frames
            ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);

            try
            {
                MemoryStream mss = new MemoryStream(File.ReadAllBytes(Path.Combine(Environment.CurrentDirectory, @"C:\Data_Warehouse\SVNRepository\CD.BNS.W5555.LT45555C.D180306.T113850.Z0101\", s)));
                Bitmap bm = (Bitmap)Image.FromStream(mss);
                pages.SaveAdd(bm, ep);
            }
            catch (Exception e)
            {
                //LogError(e, s);
            }
        }

        if (frame == sa.Length - 1)
        {
            //flush and close.
            ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush);
            pages.SaveAdd(ep);

        }

        frame++;
    }

}

我需要将多个 tiff 图像与每个 tiff 图像的所有页面连接起来。请指教!

Thanks

EDIT:从下面的答案更新

if (frame == 0)
            {
                MemoryStream ms = new MemoryStream(File.ReadAllBytes(Path.Combine(Environment.CurrentDirectory, @"C:\OMTest\Working\", s)));
                pages = (Bitmap)Image.FromStream(ms);

                var appDataPath = @"C:\Data_Warehouse\SVNRepository\Tiffiles\";
                var filePath = Path.Combine(appDataPath, Path.GetRandomFileName() + ".tif");

                //save the first frame
                pages.Save(filePath, info, ep);

                //Save the second frame if any
                int frameCount1 = pages.GetFrameCount(FrameDimension.Page);
                if (frameCount1 > 1)
                {
                    for (int i = 1; i < frameCount1; i++)
                    {
                        ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);
                        pages.SelectActiveFrame(FrameDimension.Page, i);
                        pages.SaveAdd(pages, ep);
                    }
                }
            }
            else
            {
                //save the intermediate frames
                ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);
                try
                {
                    MemoryStream mss = new MemoryStream(File.ReadAllBytes(Path.Combine(Environment.CurrentDirectory, @"C:\OMTest\Working\", s)));
                    Bitmap bm = (Bitmap)Image.FromStream(mss);
                    int frameCount = bm.GetFrameCount(FrameDimension.Page);
                    for (int i = 0; i < frameCount; i++)
                    {
                        bm.SelectActiveFrame(FrameDimension.Page, i);
                        pages.SaveAdd(bm, ep);
                    }
                }
                catch (Exception e)
                {
                    //LogError(e, s);
                }
            }

你需要选择活动帧 https://learn.microsoft.com/en-us/dotnet/api/system.drawing.image.selectactiveframe?view=netframework-4.7.2以确保您获取 TIFF 上的所有页面。在你的代码中你需要获取帧数 https://learn.microsoft.com/en-us/dotnet/api/system.drawing.image.getframecount?view=netframework-4.7.2并循环遍历这些。

else 块中的代码可能如下所示:

MemoryStream mss = new MemoryStream(File.ReadAllBytes(Path.Combine(Environment.CurrentDirectory, @"C:\Data_Warehouse\SVNRepository\CD.BNS.W5555.LT45555C.D180306.T113850.Z0101\", s)));
Bitmap bm = (Bitmap)Image.FromStream(mss);
int frameCount = bm.GetFrameCount(FrameDimension.Page);
for(int i=0;i<frameCount;i++){
    bm.SelectActiveFrame(FrameDimension.Page, i);
    pages.SaveAdd(bm, ep);
}

你可能需要调整它,因为我还没有测试过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多个多页 tiff 图像合并为单个 tiff C# 的相关文章

  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 假装 .NET 字符串是值类型

    在 NET 中 字符串是不可变的 并且是引用类型变量 这通常会让新的 NET 开发人员感到惊讶 因为他们的行为可能会将它们误认为是值类型对象 然而 除了使用实践StringBuilder对于长连接 尤其是 在循环中 在实践中是否有任何理由需
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • Visual Studio '17 未在参考管理器中显示程序集

    我遇到的问题是 我似乎无法弄清楚如何添加对某些解决方案的引用 在我从 Visual Studio 17 开始的大多数解决方案中 我在解决方案资源管理器中看到 引用 但例如对于 asp net core web api 我得到 依赖项 每当解
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • Java 中有有序集的实现吗?

    如果有人熟悉 Objective C 有一个名为的集合NSOrderedSet https developer apple com library ios documentation Foundation Reference NSOrder
  • 在 xargs 变量上使用 sed 在 shell 扩展内不起作用

    我正在尝试在 Redis 中进行批量密钥重命名 使用 shell 来替换每个密钥名称 在redis内部似乎没有更好的方法来做到这一点 redis cli n 5 KEYS staging xargs I echo RENAME echo s
  • 在哪里可以找到 WSDL.exe?

    我有 Visual Studio 2010 Ulitmate 带有 MSDN Premium 但我似乎找不到这个文件 我尝试安装 Visual Studio SDK 但似乎找不到该文件 我看过 C Windows Microsoft NET
  • 本地主机在 Chrome 中无法工作,127.0.0.1 可以工作

    我正在尝试运行本地节点服务器 但出于某种原因localhost 3000不起作用 错误页面指出This webpage is not available ERR CONNECTION CLOSED然而 127 0 0 1 3000确实有效
  • opencv中图像的二值化

    我在图像二值化方面遇到问题 通常可能模糊 我有这个图像 完成二值化后我得到 我怎样才能更好地进行二值化 我的目标是只有黑色背景和白色字母 没有其他东西 我使用了自适应阈值二值化 cv2 adaptiveThreshold image gs
  • 如何在 ASP.NET C# 中从 Mailgun 接收 HTTP POST?

    http documentation mailgun net quickstart html http documentation mailgun net quickstart html包含 Django 中 http 处理程序的一些示例代
  • 打开deploy.prototxt时出现运行时错误

    我正在尝试使用 caffe 运行一个应该打开的简单代码deploy prototxt但它无法打开文件并引发此错误 RuntimeError Could not open file home ebadawy git caffemodels b
  • XSD 和多态性

    我有点重复这个问题第一次被错误地问到 我有这个
  • 使用一个 NetStream 对象同时传输两个 Video 对象

    我试图将单个 NetStream 对象附加到两个单独的视频对象 而不是从服务器拉出冗余流 预期的行为是两个视频显示相同的内容 但是 我附加 NetStream 的最后一个视频似乎是唯一会显示内容的视频 还有其他人遇到过这个吗 如果不需要 我
  • 白色背景的错误屏幕

    当 iOS 上的 React Native 出现异常时 我会看到带有白色背景的错误屏幕 您可以通过点击的单元格看到它实际上具有异常堆栈 只是具有白色背景 不知道为什么会发生这种情况 但是有办法解决吗 在 Android 上 屏幕有红色背景
  • 如何访问 TTestSetup 类中 TTestCase 的字段

    我正在使用 DUnit 创建单元测试 我有一个类需要很长时间才能初始化 我从 TTestSetup 派生一个类 TMyTestSetup 并重写其 Setup 方法 对于我的 TTestCase 中的所有测试 仅调用此 SetUp 方法一次
  • 无法连接到 Dockerfile 中的 Wildfly

    我正在创建一个自定义 Dockerfile 其中包含官方 keycloak docker 映像的扩展 我想更改网络上下文并添加一些自定义提供程序 这是我的 Dockerfile FROM jboss keycloak 7 0 0 COPY
  • 屏幕截图不提供整个屏幕的图像

    我正在制作与图像相关的应用程序 我的屏幕上有多个图像 我已经拍了屏幕截图 但它不应该提供我的整个屏幕 最顶部和最底部的一小部分不需要在其中显示 我的顶部有导航栏 底部还有一些按钮 我不想在屏幕截图中捕获该按钮和导航栏 下面是我的屏幕截图代码
  • 正交相机并通过光线投射选择对象

    我在使用光线投射器使用正交相机选择对象时遇到了一些困难 不过 当我使用透视相机时 我没有任何问题 在两者之间切换时 我唯一要改变的是相机类型 我可以在正交视图上选择面 但它仅与我在屏幕上单击的位置松散相关 当我可以在远离物体的地方点击时 它
  • 使用Android绘制自定义视图

    我正在我的应用程序中绘制一个自定义视图 该视图基本上将参数 XML 作为要显示的文本 然后继续无限旋转它 当我进行这个控制时 我有一些疑问我想问 我已经制作了 2 个样式属性 我已在attrs xml文件 这些属性是设置我的控件中使用的圆的
  • 核心数据 - 货币小数类型

    我在最近的一篇文章中读到 十进制数据类型是核心数据中用于货币建模的最佳选择 因为它不存在浮点问题 我搜索了苹果文档和谷歌 似乎找不到任何有关使用 Decimal 类型的文档 有人有相关文档的链接吗 Thanks 使用 Decimal 作为数
  • 如何让我的java程序在GPU上运行?如何更改我的程序可以加速?[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我写了一个由几个类组成的程序 但是计算速度太慢 粗体的程序 我希望让我的java程序在GPU上运行以加快计算速度 或者有其他方法来加快
  • Flutter延迟一段时间后如何运行代码?

    我想在构建小部件后经过一定的延迟后执行一个函数 在 Flutter 中执行此操作的惯用方法是什么 我想要实现的目标 我想从默认开始FlutterLogoWidget 然后更改其style一段时间后的财产 您可以使用Future delaye
  • 键入任何?没有下标成员

    我想从个人资料字典中获取地址 但收到错误 键入任何 没有下标成员 var address String Any Address someLocation City ABC Zip 123 Address someLocation City
  • 将多个多页 tiff 图像合并为单个 tiff C#

    在我的场景中 我有 3 个或更多多页 tiff 图像 我需要将它们合并为单个 tiff 图像 下面是我尝试过的代码 它合并到单个 tiff 图像中 但仅与所有 tiff 图像的第一页合并 private static void MergeT