如何使用 FitsReader 读取 FITS 文件并将其保存到 fitsHeaderDataUnit 中?有人可以给我任何示例吗?

如何使用 FitsReader 读取 FITS 文件并将其保存到 fitsHeaderDataUnit 中?有人可以给我任何示例吗?谢谢(FitsReader 是TA.ObjectOrientedAstronomy.FlexibleImageTransportSystem内的函数)


```c#
//运行报错:ArgumentException: illegal characters in path
//Create new OpenFileDialog
       OpenFileDialog openFileDialog = new OpenFileDialog
        {
            InitialDirectory = "c:\\download",
            Filter = "(*FITS)|*FITS|All files (*.*)|*.*",
            Title = "Select .FITS File",
            RestoreDirectory = true,
        };
        
        // Show open file dialog box
        Nullable<bool> result = openFileDialog.ShowDialog();

        // Process open file dialog box results
        if (result == true)
        {
            //Get the path of specified file
            filePath = openFileDialog.FileName;
            TextBox2.Text = openFileDialog.FileName;

            FitsHeader fitsHeader;
            FitsHeaderDataUnit fitsHeaderDataUnit ;

            FileStream fs = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read);
            FitsReader fitsReader = new FitsReader(fs);

            fitsHeader = fitsReader.ReadPrimaryHeader().Result;
            fitsHeaderDataUnit = fitsReader.ReadPrimaryHeaderDataUnit().Result;
         }

```

该回答引用ChatGPT

如有疑问,可以回复我!

可能是由于文件路径中包含非法字符或者文件不存在导致的。请确保 filePath 变量包含了正确的文件路径,或者将其直接传递给 FitsReader,例如:

string filePath = openFileDialog.FileName;
FitsReader fitsReader = new FitsReader(filePath);

另外,你可以考虑在使用 FileStream 读取文件之后,显式地关闭文件流,以确保资源被释放。你可以在代码结尾处添加以下代码:


fs.Close();

看下文档

fitsread
读取 FITS 文件中的数据全页折叠
语法
data = fitsread(filename)
data = fitsread(filename,'raw')
data = fitsread(filename,extname)
data = fitsread(filename,extname,index)
data = fitsread(filename,___,Name,Value)
说明
示例
data = fitsread(filename) 读取由 filename 指定的普适图像传输系统 (FITS) 文件的主要数据,并将其作为调整后的数组返回。该函数将未定义的数据值替换为 NaN,根据斜率和截距值来缩放数值数据,并始终返回双精度值。

示例
data = fitsread(filename,'raw') 读取 FITS 文件的主要数据,不作出调整。此语法不缩放从文件中读取的数据,将未定义的值替换为 NaN。返回的数据保持在文件中指定的类类型。

示例
data = fitsread(filename,extname) 读取 extname 指定的 FITS 文件扩展中的数据。FITS 文件包含主要数据,并且可以有选择性地包含任意数目的可选组件(FITS 术语中称为扩展)。

示例
data = fitsread(filename,extname,index) 还指定存在多个相同扩展类型时的索引。

示例
data = fitsread(filename,___,Name,Value) 使用一个或多个由名称-值参数定义的附加选项从 FITS 文件中读取数据。例如,TableColumns 指定要读取哪些列。


using System;
using System.IO;
using TA.ObjectOrientedAstronomy.FlexibleImageTransportSystem;

namespace FitsReaderExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create new OpenFileDialog
            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                InitialDirectory = "c:\\download",
                Filter = "(*FITS)|*FITS|All files (*.*)|*.*",
                Title = "Select .FITS File",
                RestoreDirectory = true,
            };

            // Show open file dialog box
            Nullable<bool> result = openFileDialog.ShowDialog();

            string filePath;
            FitsHeader fitsHeader;
            FitsHeaderDataUnit fitsHeaderDataUnit;

            // Process open file dialog box results
            if (result == true)
            {
                // Get the path of specified file
                filePath = openFileDialog.FileName;
                Console.WriteLine($"Selected file: {filePath}");

                using FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                FitsReader fitsReader = new FitsReader(fs);

                fitsHeader = fitsReader.ReadPrimaryHeader().Result;
                fitsHeaderDataUnit = fitsReader.ReadPrimaryHeaderDataUnit().Result;

                Console.WriteLine($"Fits Header: {fitsHeader}");
                Console.WriteLine($"Fits Header Data Unit: {fitsHeaderDataUnit}");
            }
            else
            {
                Console.WriteLine("No file selected.");
            }

            Console.ReadKey();
        }
    }
}

参考GPT和自己的思路,以下是使用 FitsReader 读取 FITS 文件并将其保存到 fitsHeaderDataUnit 中的 C# 代码:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using nom.tam.fits; // 引入FitsReader所在的命名空间

namespace ReadFitsFile
{
    class Program
    {
        static void Main(string[] args)
        {
            // 定义FITS文件路径
            string filePath = "sample.fits";

            // 创建FITS读取器
            Fits fitsReader = new Fits(filePath);

            // 读取FITS文件头数据单元
            BasicHDU fitsHeaderDataUnit = fitsReader.ReadHDU();

            // 关闭FITS读取器
            fitsReader.Close();

            // 打印FITS文件头信息
            fitsHeaderDataUnit.Info();
        }
    }
}

上述代码中,我们首先引入了 FitsReader 所在的命名空间 nom.tam.fits,然后定义了一个字符串变量 filePath,用于存储 FITS 文件路径。接着,使用 Fits 类实例化一个 FITS 读取器,读取 FITS 文件头数据单元,并将其保存到 BasicHDU 类型的变量 fitsHeaderDataUnit 中。最后,我们通过调用 BasicHDU 类的 Info 方法打印 FITS 文件头信息,并关闭了 FITS 读取器。

注意:在运行上述代码之前,应当先将 TA.ObjectOrientedAstronomy.FlexibleImageTransportSystem 命名空间所在的程序集添加到项目引用中。
回答不易,还请采纳!!!

参考GPT和自己的思路:在您的代码中,FitsReader 函数的参数是 FileStream 类型的文件流对象,因此您需要打开选定的文件并将其作为参数传递给 FitsReader。此外,您需要在代码中处理任何潜在的异常。

下面是一个示例代码,演示了如何使用 FitsReader 读取 FITS 文件并将其保存到 fitsHeaderDataUnit 中:

using TA.ObjectOrientedAstronomy.FlexibleImageTransportSystem;
using Microsoft.Win32;
using System;
using System.IO;

// 创建 OpenFileDialog 实例,并设置过滤器和初始目录
OpenFileDialog openFileDialog = new OpenFileDialog
{
    Filter = "FITS Files (*.fits)|*.fits",
    InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
};

// 打开对话框并获取结果
bool? result = openFileDialog.ShowDialog();
if (result == true)
{
    try
    {
        // 打开选定的文件并读取其内容
        using (FileStream fileStream = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read))
        {
            FitsReader fitsReader = new FitsReader(fileStream);
            FitsHeaderDataUnit fitsHeaderDataUnit = fitsReader.ReadPrimaryHeaderDataUnit().Result;

            // 在这里可以处理读取到的数据
        }
    }
    catch (Exception ex)
    {
        // 处理异常
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}


在这个示例中,我们首先创建了 OpenFileDialog 实例,设置了初始目录和过滤器。然后我们打开对话框并获取结果。如果用户单击了“打开”按钮,我们会尝试打开选定的文件并读取其内容。

在 try 块中,我们创建一个 FileStream 对象并将其传递给 FitsReader。我们调用了 ReadPrimaryHeaderDataUnit 方法来读取文件内容,并将结果存储在 fitsHeaderDataUnit 变量中。在这个示例中,我们没有对读取到的数据进行任何处理,但是您可以在这里添加任何需要的代码来处理数据。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据你提供的代码,似乎路径名有误,导致了 ArgumentException 异常,你可以在路径名字符串前加上 @ 符号,这样可以避免转义字符的问题:

//运行报错:ArgumentException: illegal characters in path
//Create new OpenFileDialog
OpenFileDialog openFileDialog = new OpenFileDialog
{
    InitialDirectory = @"c:\download",
    Filter = "(*FITS)|*FITS|All files (*.*)|*.*",
    Title = "Select .FITS File",
    RestoreDirectory = true,
};

// Show open file dialog box
Nullable<bool> result = openFileDialog.ShowDialog();

// Process open file dialog box results
if (result == true)
{
    //Get the path of specified file
    string filePath = openFileDialog.FileName;
    TextBox2.Text = openFileDialog.FileName;

    FitsHeader fitsHeader;
    FitsHeaderDataUnit fitsHeaderDataUnit ;

    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    FitsReader fitsReader = new FitsReader(fs);

    fitsHeader = fitsReader.ReadPrimaryHeader().Result;
    fitsHeaderDataUnit = fitsReader.ReadPrimaryHeaderDataUnit().Result;
}

如果你需要更多的帮助,可以提供更多关于 FitsReader 和 FITS 文件格式的信息,这样我们就可以更好地帮助你。
如果我的回答解决了您的问题,请采纳!