在.NET 中读取/保存 PixelFormat.Format48bppRgb PNG 位图?

2023-12-14

我已经能够使用以下 C# 代码创建 Format48bppRgb .PNG 文件(来自一些内部 HDR 数据):

Bitmap bmp16 = new Bitmap(_viewer.Width, _viewer.Height, System.Drawing.Imaging.PixelFormat.Format48bppRgb);
System.Drawing.Imaging.BitmapData data16 = bmp16.LockBits(_viewer.ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly, bmp16.PixelFormat);
unsafe {  (populates bmp16) }
bmp16.Save( "C:/temp/48bpp.png", System.Drawing.Imaging.ImageFormat.Png );

ImageMagick(和其他应用程序)验证这确实是一个 16bpp 图像:

C:\temp>identify 48bpp.png
48bpp.png PNG 1022x1125 1022x1125+0+0 DirectClass 16-bit 900.963kb

然而,我很失望地发现,在读回 PNG 时,它已被转换为 Format32bppaRgb,使用时:

Bitmap bmp = new Bitmap( "c:/temp/48bpp.png", false );
String info = String.Format("PixelFormat: {0}", bmp.PixelFormat );
...

鉴于 PNG 编解码器可以编写 Format48bppRgb,有什么方法可以使用 .NET 读取它而不进行转换?我不介意它是否为 DrawImage 调用执行此操作,但我想访问解压缩的原始数据以进行某些直方图/图像处理工作。


仅供参考 - 我确实使用 System.Windows.Media.Imaging 找到了一个 .NET 解决方案(我一直严格使用 WinForms/GDI+ - 这需要添加 WPF 程序集,但有效。)有了这个,我得到了 Format64bppArgb PixelFormat,所以没有丢失信息:

using System.Windows.Media.Imaging; // Add PresentationCore, WindowsBase, System.Xaml
...

    // Open a Stream and decode a PNG image
Stream imageStreamSource = new FileStream(fd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
PngBitmapDecoder decoder = new PngBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[0];

    // Convert WPF BitmapSource to GDI+ Bitmap
Bitmap bmp = _bitmapFromSource(bitmapSource);
String info = String.Format("PixelFormat: {0}", bmp.PixelFormat );
MessageBox.Show(info);

...

这段代码片段来自:http://www.generoso.info/blog/wpf-system.drawing.bitmap-to-bitmapsource-and-viceversa.html

private System.Drawing.Bitmap _bitmapFromSource(BitmapSource bitmapsource) 
{ 
    System.Drawing.Bitmap bitmap; 
    using (MemoryStream outStream = new MemoryStream()) 
    { 
        // from System.Media.BitmapImage to System.Drawing.Bitmap 
        BitmapEncoder enc = new BmpBitmapEncoder(); 
        enc.Frames.Add(BitmapFrame.Create(bitmapsource)); 
        enc.Save(outStream); 
        bitmap = new System.Drawing.Bitmap(outStream); 
    } 
    return bitmap; 
} 

如果有人知道不需要 WPF 的方法,请分享!

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

在.NET 中读取/保存 PixelFormat.Format48bppRgb PNG 位图? 的相关文章

随机推荐

  • cudaMemcpy 到主机来获取设备分配的内存仍然不可能吗?

    我有一个带有指针的数据结构 想想链表 在启动读取输入数据的内核之前无法确定其大小 因此 我在输入处理期间在设备上分配数据 但是 尝试将该数据复制回主机失败 据我所知 这是因为 CUDA 存在限制 不允许运行时 API 访问设备分配的内存 然
  • 当没有抛出异常时,C++ 异常会以哪些方式减慢代码速度?

    我读到 使用 C 异常进行异常处理 而不是检查返回值 会产生一些开销 我只是谈论没有抛出异常时产生的开销 我还假设您需要实现实际检查返回值并执行适当操作的代码 无论什么都相当于 catch 块将执行的操作 而且 将抛出内部有 45 个状态变
  • LINQ - 嵌套查询

    我有一个 SQL 语句 正在尝试将其转换为 LINQ 查询 我需要这样做 因为我无法编辑我的数据库 无论如何 我有一个如下所示的 SQL 语句 SELECT CustomerID FirstName LastName Gender Birt
  • 将经度和纬度与 Intent 传递给另一个类

    我试图将纬度和经度从 MainActivity 中的 onLocationChanged 传递到另一个包com route provider classDataPrivider但我收到此错误 我该怎么做 我如何在 DataProvider
  • Res.download() 使用 html 表单提交,但不使用 Axios post 调用

    我正在编写一个小型应用程序 它将来自 React 应用程序的信息提交到 Express 服务器的 download API 然后将新文件写入本地文件系统 并使用 Express res download 在客户端下载新创建的文件 在 fs
  • Android 上的 Google 通讯录 api

    我已经这样做好几天了 我很困惑 我在很多地方读到谷歌提供的java客户端 无法在android上工作 但事实并非如此 有人能指出我正确的方向吗 public void onCreate Bundle savedInstanceState s
  • Python 中的单引号与双引号[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 Locked 这个问题及其
  • IExtenderProvider 根据对象类型仅添加一些属性

    我遇到了一个问题 我不知道这是否确实可行 如果有一种 hacky 方式 我全力以赴 但我还没有找到 我有一个IExtenderProvider我用来拥有自己的组件UITypeEditor对于第三方控件的某些属性 由于显而易见的原因 我无法更
  • 我应该如何对多线程代码进行单元测试?

    到目前为止 我已经避免了测试多线程代码的噩梦 因为它看起来像是一个雷区 我想问人们如何测试依赖线程成功执行的代码 或者人们如何测试仅在两个线程以给定方式交互时才出现的此类问题 对于当今的程序员来说 这似乎是一个非常关键的问题 恕我直言 汇集
  • 为什么 macOS Visual Studio Code 使用错误的 Python 解释器?

    我在 macOS Sierra 10 12 6 上运行 VS Code 1 33 1 当我运行如下所示的简单 Python 程序时 VS Code 使用 Mac 上安装的 Python 2 7 而不是我使用 Homebrew 安装的 Pyt
  • 如何检查文件是否正在使用?

    在尝试打开文件进行读取之前 有什么方法可以先测试文件是否正在使用 例如 如果文件仍在写入或被视为正在使用 则此代码块将引发异常 try FileStream stream new FileStream fullPath FileMode O
  • REST-Endpoint:无返回值的异步执行

    我的问题可能很容易解决 但目前我不明白 在我的 Quarkus App 中 我有一个 REST Endpoint 它应该调用一个方法 不等待结果并立即返回 202 HTTP Statuscode POST Produces MediaTyp
  • Mysqli DELETE QUERY 在 PHP 脚本中不起作用

    我使用下面的代码从表中删除一个条目 我想做的是检查是否从表中删除了任何值 如果删除了一个值 脚本应该打印成功 否则为 false 这是我所实现的 直到现在请帮忙
  • 将声音从左向右移动

    如何将 iPhone 耳机的声音从左移到右 我认为你想要 AVAudioPlayer 的 pan 属性 检查AVAudioPlayer 文档 从 pan 属性 通过设置这个属性你可以 将声音放置在立体声场中 值 1 0 为全左 0 0 为
  • Matlab z buffer 用于模拟kinect

    我们正在尝试模拟简单的 kinect 输出 我已经在 Matlab 中渲染了一个三角形网格 现在我想获取渲染形状的图形 轴的深度缓冲区 我如何在 matlab 中做到这一点 即如何访问图形的深度缓冲区 你可以尝试this
  • IIS 上的 .htaccess 或 .htpasswd 等效项?

    有谁知道 IIS 是否有相当于 htaccess 和 htpassword 的文件 我被要求将一个应用程序迁移到 IIS 该应用程序使用 htaccess 根据 htaccess 文件的内容控制对各种 URL 中的文件集的访问 我进行了谷歌
  • 如何让.net cf中的所有进程都运行

    我想从我的应用程序中获取 Windows Mobile 6 5 中所有正在运行的应用程序的列表 谁能告诉我如何为CF做到这一点 你必须 P 调用工具帮助 API 曾经有一篇 MSDN 文章对此进行了介绍 将其全部放入此处的帖子中有点长 但也
  • 如何根据用户的选择动态生成SQL查询?

    我需要创建一个 GUI 用户可以使用它选择多个属性 这些属性将用于查询数据库以找到合适的人 我正在寻找如何根据用户的选择动态生成数据库查询的想法 查询将包含多个字段 但为了了解这个想法 我将仅包含以下三个字段作为示例 职业 可以有 0 到
  • Spring cloud Stream中的事务

    Problem 我正在尝试逐行读取一个大文件并将消息放入 RabbitMQ 中 我想在文件末尾提交rabbitMQ 如果文件中的任何记录是坏的 那么我想撤销发布到队列的消息 技术 弹簧靴 春云流水 RabbitMQ 您能帮我实现这个过渡吗
  • 在.NET 中读取/保存 PixelFormat.Format48bppRgb PNG 位图?

    我已经能够使用以下 C 代码创建 Format48bppRgb PNG 文件 来自一些内部 HDR 数据 Bitmap bmp16 new Bitmap viewer Width viewer Height System Drawing I