保存带有透明度/Alpha 通道的 TIFF

2023-12-21

这是我的问题:

我需要创建一个 TIFF 和一个 PNG,其中调色板包含特定颜色和 Alpha。

我实际上能够处理 PNG,但不能处理 TIFF。

我在互联网上搜索并发现 TIFF 应该处理透明度,但并非所有软件都可以。

我尝试了很多方法来加载 TIFF,但它们都会导致调色板具有重置的 Alpha 值。

所以我认为问题出在我如何保存 TIFF,但我找不到任何其他方法。

以防万一:调色板设置为 #00FFFFFF,然后设置为 #FFXXXXXX、#FEXXXXXX 等。每当我加载 TIFF 时,颜色都会恢复为:#FFFFFFFF、#FFXXXXXX、#FFXXXXXX 等

创建图像

public static BitmapSource CreateImage()
{
    int width = ImageGenerator.sizeW;
    int height = ImageGenerator.sizeH;
    int bytesPerPixel = (format.BitsPerPixel + 7) / 8;
    int stride = width * bytesPerPixel;
    byte[] pixels = new byte[height * stride];

    List<Color> colors = new List<Color>();
    PopuplateColors(ref colors);

    BitmapPalette myPalette = new BitmapPalette(colors);

    PopulatePixels(height, stride, ref pixels);

    BitmapSource image = BitmapSource.Create(width, height, 96, 96, format, myPalette, pixels, stride);

    if (imageStreamSource != null)
        imageStreamSource.Dispose();

    return image;
}

创建TIFF

public static void CreateTIFF()
{
    BitmapSource image = CreateImage();

    FileStream stream = new FileStream("test.tif", FileMode.Create);
    TiffBitmapEncoder encoder = new TiffBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(image));
    encoder.Save(stream);
    stream.Dispose();
}

GetTIFF

public static ImageBrush GetTIFF()
{
    /* Another try
    BitmapImage bitmap = new BitmapImage();
    bitmap.BeginInit();
    bitmap.UriSource = new Uri("test.tif",UriKind.Relative);
    bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
    bitmap.EndInit();
    imagePalette = bitmap.Palette;

    CreateData(bitmap);
    return new ImageBrush(bitmap);*/

    //The last try i've done, i've looked at the palette through debug
    Bitmap bitmap = new Bitmap("test.tif");
    System.Drawing.Imaging.ColorPalette cp = bitmap.Palette;
    bitmap.MakeTransparent(cp.Entries[0]);

    return new ImageBrush();

    /* How I normally read the TIFF
    TiffBitmapDecoder decoder = new TiffBitmapDecoder(GetImage("test.tif"), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    BitmapSource bitmapSource = decoder.Frames[0];
    imagePalette = bitmapSource.Palette;

    CreateData(bitmapSource);
    return new ImageBrush(bitmapSource);*/
}

调色板或索引颜色 TIFF 不支持颜色图中的 Alpha 值。每个颜色分量的条目为 16 位,但仅存储 R、G、B(无 Alpha 分量)。如果您尝试在颜色图中存储带有 Alpha 的 TIFF,则 Alpha 将丢失。

不过,您可能可以使用单独的“透明掩码”(一位掩码)来存储 TIFF。这将是一个单独的 IFD,这意味着某些软件可能不会将其与 RGB 值合并以显示透明图像。但如果您控制读取和写入 TIFF 文件的软件,我认为这将是您实现透明度的最佳选择。

如果您需要颜色图中的透明度信息(并且您控制读取和写入),另一种选择是使颜色图中的第一种颜色始终透明,或者添加带有您可以设置的透明索引的自定义标签至透明。您的图像仍应在其他软件中正确显示,但没有透明度。

查看 TIFF 标签ColorMap https://www.awaresystems.be/imaging/tiff/tifftags/colormap.html and PhotometricInterpretation https://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html(还有一个Indexed扩展标记,但它不会更改存储在 RGB 图像的颜色图中的分量数量)。

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

保存带有透明度/Alpha 通道的 TIFF 的相关文章

  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • Web API 复杂参数属性均为 null

    我有一个 Web API 服务调用可以更新用户的首选项 不幸的是 当我从 jQuery ajax 调用中调用此 POST 方法时 请求参数对象的属性始终为 null 或默认值 而不是传入的值 如果我使用 REST 客户端调用相同的方法 我使
  • 本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

    这相当复杂 所以请耐心听我说 我有一个用本机 仅限 Win32 C 编码的第 3 方程序 目标 作为目标设计的一部分 它实现了一个 dll 插件系统 本机 DLL 当放置在程序的 ext 目录中时 由目标加载 然后 目标根据需要调用每个 D
  • 如何使用 Regsvr32 注册 .NET COM DLL?

    我有一个使用 COM DLL 的 VB6 应用程序 该DLL是用C 编写的 在 C 项目属性中 我检查了 Register for COM interop 选项 VB6 应用程序在我的开发机器上运行良好 C 代码完全遵循以下格式 CodeP
  • 使用 boost::asio 是否有一种可移植的方法来查找空闲端口号

    我目前正在尝试找出一种方法来查找空闲端口号以建立连接 最好使用 boost asio 然后 该端口号将用于侦听 只有这样我才能打开套接字 大致来说 有没有办法做到 tcp resolver query query localhost por
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 将私有部分保留在 C++ 标头之外:纯虚拟基类与 pimpl

    我最近从 Java 和 Ruby 切换回 C 令我惊讶的是 当我更改私有方法的方法签名时 我必须重新编译使用公共接口的文件 因为私有部分也位于 h 文件中 我很快想出了一个解决方案 我想这对于 Java 程序员来说是典型的 接口 纯虚拟基类
  • 从动态服务器中抓取 html 列表数据

    哈喽大家好 抱歉提出转储问题 这是我最后的手段 我发誓我尝试了无数其他 Stackoverflow 问题 不同的框架等 但这些似乎没有帮助 我有以下问题 一个网站显示一个数据列表 前面有大量的 div li span 等标签 它是一个很大的
  • DLR 返回类型

    我需要 DLR 的帮助 我正在实现 IDynamicMetaObjectProvider 和 DynamicMetaObject 但在获取预期返回类型时遇到一些问题 我在元对象中覆盖 BindInvokeMember 我可以看到所有参数类型
  • 需要帮助将 winform 迁移到 net 5

    我正在将 winform 应用程序从 net core 3 1 移植到 net 5 并收到以下错误 严重性代码 说明 项目文件行抑制状态 错误NETSDK1136 目标平台必须设置为Windows 通常 通过在 TargetFramewor
  • 将控制台输入和输出重定向到文本框

    您好 提前致谢 我正在尝试 非常努力 将控制台输入和输出重定向到文本框 到目前为止 输出工作正常 但问题在于输入 例如 我无法执行一个简单的程序来执行以下操作 Console WriteLine 请输入您的姓名 字符串名称 Console
  • 有没有办法对 RichTextBox 的撤消历史进行分组或暂时禁用它?

    我目前正在研究 WPF 中 RichTextBox 内的表格 在 WPF 中 表格没有行和列 只有行 每行都有一定数量的单元格 当用户按下 添加列 按钮时 我的程序会向每一行添加一个新单元格 使用此方法的问题是 在用户添加一列后 如果他们按
  • 创建 PING 程序时限制 ICMP 回显答复

    我正在编写一个多线程 ping 程序 我在每个线程 针对每个 IP 上创建了原始套接字 并使用 sendto 向每个线程发送了 ICMP Echo 请求 然后在每个线程中执行了 receivevfrom 我正在从各种套接字中的 IP 获取消
  • System.IndexOutOfRangeException:索引超出了数组的范围[重复]

    这个问题在这里已经有答案了 我正在开发一个 ATM 软件作为家庭作业 我想知道今天处理的交易总量 为此我编写了以下代码 public decimal getDayTransaction int accountid string date s
  • 如何设置扬声器声音增强设置

    如何以编程方式设置 Windows 扬声器设置 增强 选项卡 中可用的声音效果 恐怕这是不可能的 参见 Maurits 对他的评论blog http blogs msdn com b matthew van eerde archive 20
  • 所有区域的启用保护模式必须设置为相同的值(启用或禁用)

    我正在尝试使用Selenium Internet Explorer驱动程序 但当我尝试实例化它时它崩溃了 TestInitialize public void TestInitialise ieDriver new InternetExpl
  • C++ 从文件中读取字符串

    我试图将字符串直接存储到一个文件中 以便稍后在 C 中读取 基本上 对于整个范围 我试图将带有字符串变量的对象数组存储在文件中 并且这些字符串变量将通过类似 object 的内容读取 0 字符串 然而 每次我尝试读取字符串变量时 系统都会给
  • 将整个单词与特殊字符匹配的正则表达式不起作用? [复制]

    这个问题在这里已经有答案了 我正在经历这个问题C Regex Match 整个单词 https stackoverflow com q 1209049 443568 它说要匹配整个单词使用 b模式 b 这对于匹配没有任何特殊字符的整个单词效
  • In 和 Out 属性在 .NET 中如何工作?

    我一直在尝试跨序列化数组AppDomain边界 使用以下代码 public int Read byte buffer int offset int count return base Read buffer offset count 作为猜

随机推荐

  • 检查 CalledProcessError 的输出

    我正在使用 python 子进程模块中的 subprocess check output 来执行 ping 命令 我是这样做的 output subprocess check output ping c 2 W 2 1 1 1 1 它引发
  • 如何正确配置 NSFetchedResultsController

    我将 NSFetchedResultsController 放入我的代码中 这样我就可以对表视图数据进行很好的自动分段 所以我正在运行测试以确保一切正常 我的持久存储中有一个 Book 实体 我将首先以旧方式执行获取 然后尝试使用 NSFe
  • Django Admin:根据先前的字段值填充字段

    我在 django admin 中有一个模型如下 ChoiceA on false on false on true on true ChoiceB always always never never id models CharField
  • SAFESEH:NO 选项的实际作用

    我正在尝试使用boost asio spawn功能就像在example http www boost org doc libs 1 55 0 doc html boost asio example cpp03 spawn echo serv
  • 使用 Javascript 向用户发送 HTTP 附件(打开浏览器的“另存为...”对话框)

    我是网络开发的新手 所以如果这个问题很菜鸟 我深表歉意 我想在 Javascript 中请求时向用户提供服务器硬盘上的文件 即发送 HTTP 附件以触发浏览器的 另存为 对话框 用户单击页面上的按钮 服务器根据他 她的一些帐户设置 和其他参
  • 在 Unity 中查找一组 3D 点的定向边界框

    我有一组 3D 点 或者实际上是小球体 我需要使用 Unity 3D 将它们包围在尽可能小的 3D 框内 在封闭框只能移动和缩放的情况下 解决方案非常简单 您只需迭代所有点并封装每个点即可 但我还需要找到盒子的最佳方向 因此 为了用 ASC
  • 使用 R 在 postgres 中设置模式名称

    我正在使用 R 连接到 PostgreSQL 数据库 使用以下函数完成连接 dbConnect m dbname dbname host host port port user user password password m是驱动程序 p
  • Java Applet 使用 Chrome 浏览器启动客户端程序的替代方案是什么?

    我正在使用 ASP net 和 C 开发 Web 应用程序 我的目标是检查客户端计算机上的桌面应用程序 如果它存在 那么我应该启动它 否则 如果它不存在 我们应该下载 安装然后启动它 我可以使用 Java Applet 开发这个模块 但不幸
  • Perl 函数名称冲突

    我遇到的情况是 我正在使用的模块有一个函数 其名称与我自己的模块中的函数完全相同 当我尝试调用模块中的函数时 OO Perl 所以 self gt function 它改为从其他模块调用该函数 我已经通过重命名我的函数来解决这个问题 但有趣
  • 如何处理Excel工作表中的数据更改事件以刷新所有数据透视表?

    我有一个应用于工作表及其更改的 VBA 代码 因此 每当工作表中有新条目或删除 任何更改 时 它都会刷新附加到它的所有数据透视表 Private Sub Worksheet Change ByVal Target As Range This
  • 检查python脚本中是否挂载了NFS共享

    我编写了一个 python 脚本 该脚本依赖于某个可用的 NFS 共享 如果未安装 NFS 共享 它会很乐意将文件复制到应安装的本地路径 但稍后当它尝试将在 NFS 服务器上创建的某些文件复制回来时会失败 我想专门捕获这个错误 这样我就可以
  • 使用 PNG 图像作为 GrabCut 的蒙版

    我有一个带有绿色和红色线条以及透明背景的 png 图像 我需要使用它作为执行 GrabCut 的遮罩 但我得到了意想不到的结果 这是我的代码 find the mask Mat mask mask create image size CV
  • 关闭弹出窗口并导航到 jQuery Mobile 中的另一个页面

    当用户按下弹出窗口内的按钮时 我试图关闭弹出窗口 对话框 并导航到另一个页面 单页面应用程序 多个 页面 jQM 1 4 0 如果我点击弹出窗口中的 是 按钮 它将导航到我想要的 page3 然后跳回起始页 如果我注释掉 popup clo
  • Go 中的一流函数

    我来自 JavaScript 它具有一流的函数支持 例如 您可以 将一个函数作为参数传递给另一个函数 从函数返回一个函数 有人能给我一个例子来说明如何在 Go 中做到这一点吗 Go语言和函数式编程 http livingcode org 2
  • MSMQ 或 Service Broker 或用于 FIFO 消息处理的批量插入?

    我们有一个场景 需要针对传入的实时事件对数据库使用更新 插入查询 我们可以选择下面提供的任何一个选项 1 MSMQ 2 SQL 服务代理 3 自定义构建的缓存机制 使用文件缓存 批量插入 触发器将插入转换为更新 如果行已存在 等 我们没有使
  • 如何在 GitHub 操作构建期间引用我的存储库中的目录?

    我有一些测试数据用于 pytest 的单元测试 我用环境变量设置了它们的位置 查看我的 pytest 日志 构建会看到环境变量 但它们引用的位置不存在 在 GitHub Actions 文档中 存储库应位于 home runner Repo
  • 在 Glassfish 服务器上的 Web 服务中使用数据库时出现“找不到合适的驱动程序”错误

    我有一个 Java Web 应用程序 并使用来自消费者 Java 应用程序的操作来处理 MySQL 数据库 当我尝试连接到数据库时 我得到 No suitable driver found for jdbc mysql localhost
  • 检索 Delphi 窗口句柄

    我正在尝试从外部应用程序获取 Delphi 应用程序的窗口句柄 我可以看到创建了一些窗口 TApplication TFrmMain 和其他一些窗口 并且我知道 TApplication 是 控制器 但从不可见 但是 我可以读取真实窗口的值
  • Rails form_for 提交按钮不起作用

    感谢您的耐心等待 对于 Rails 来说还是很陌生 使用 Rails 3 2 为一个简单的应用程序制作注册页面 我的问题是 无论表单中的信息是否有效 表单上的提交按钮都不会产生任何效果 用户模型和数据库似乎都工作正常 如果我从 Rails
  • 保存带有透明度/Alpha 通道的 TIFF

    这是我的问题 我需要创建一个 TIFF 和一个 PNG 其中调色板包含特定颜色和 Alpha 我实际上能够处理 PNG 但不能处理 TIFF 我在互联网上搜索并发现 TIFF 应该处理透明度 但并非所有软件都可以 我尝试了很多方法来加载 T