0

如何在 C# 中使用 32 位浮点图像?

我更喜欢使用 openExr 但是,tiff 或类似的也可以,基本上我只想从磁盘加载一个 32 位浮点(每像素/通道 32 位)图像并获取单个通道的像素值并将其放入数组,最好是尽可能简单的解决方案。

这是我制作的一个简单的测试示例,适用于 png: 在此处输入图像描述

下载视觉工作室项目

代码:C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
using System.IO;

namespace ImgToVxlForm
{
    public partial class Form1 : Form
    {
        Bitmap myBitmap;
        Byte[] byteArr;

        public Form1()
        {
            InitializeComponent();
        }

        private void browseBtn_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog dlg = new OpenFileDialog())
            {
                dlg.Title = "Open Image";
                dlg.Filter = "png files (*.png)|*.png";
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    myBitmap = new Bitmap(dlg.FileName);
                    pictureBox1.Image = myBitmap;
                }
            }
        }

        private void runBtn_Click(object sender, EventArgs e)
        {
            byteArr = (ImageToArr(myBitmap));
            for (int i = 0; i < byteArr.Length; i++)
            {
                // Debug.WriteLine(byteArr[i]);
            }
            lb_debug.Text = byteArr.Length.ToString();
        }

        public static byte[] ImageToArr(Bitmap inBitmap)
        {
            int w = inBitmap.Width;
            int h = inBitmap.Height;
            Byte[] tmpByteArr = new byte[w * h];
            int count = 0;
            for (int y = 0; y < h; y++)
            {
                for (int x = 0; x < w; x++)
                {
                    Color pixelColor = inBitmap.GetPixel(x, y);
                    tmpByteArr[count] = pixelColor.R;
                    count++;
                }
            }
            return tmpByteArr;
        }
    }
}

下载 16 和 32 位测试 tiff 图像:(19KB)

4

1 回答 1

0

您正在使用基于 GDI+ Win32 API 的 System.Drawing 包。根据 ImageCodecInfo 类文档,您会看到它内置了对多种类型的支持:

图像编码器内置于 GDI+ 中,用于 BMP、JPEG、GIF、TIFF 和 PNG 格式。

理论上,使用 TIFF 图像应该可以工作。如果您需要添加对其他解码器的支持,您可以找到专门执行此操作的包,然后使用包的本机类型或编写生成 Bitmap 对象供您使用的包装器,或者您可以使用更具扩展性的 API,例如,Windows 映像组件。

当您在 .NET 领域时,有一个非常好的 DirectX(以及相关技术,包括 WIC)包装器,称为SharpDX。这是一个GitHub 示例,展示了如何执行此操作。这里需要注意的是,它是 System.Drawing 的较低级别的 API,需要更多样板代码才能上线,以及直接向您公开 COM;好处是可以使用系统上可用的任何 WIC 兼容编解码器,并且您可以使用相同的 API 来枚举支持的格式。

于 2017-05-02T17:27:02.673 回答