CSharpFits:写入FITS文件会生成错误的图像

问题描述

我目前正在研究一个C#项目,以减少echelle频谱,这些频谱基本上是FITS格式的2D 16bit图像。到目前为止,最终结果应该是另一个FITS文件,但是是一维的。

对于此任务,我使用CSharpFits-library(https://github.com/SidWatch/CSharpFITS),它是Java实施(https://github.com/nom-tam-fits/nom-tam-fits)的端口,所有文档都位于该端口。

该图书馆仍处于学习阶段。到目前为止,我已经成功读取了FITS文件,并将其转换为int数组,并处理了数据。但是尝试编写FITS文件给我带来了一个特别的问题,我无法回避。下面的代码作为一个玩具示例,可以产生图片中所示的结果。

private void SaveFits()
{
    int[][] array = new int[10][];
    int delta = 65536 / 100;
    for (int i = 0; i < array.Length; i++)
    {
        array[i] = new int[10];
        for (int j = 0; j < array[i].Length; j++)
        {
            array[i][j] = (i + 1) * (j + 1) * delta;
         }
    }
    nom.tam.fits.Fits fits = new nom.tam.fits.Fits();
    nom.tam.fits.BasicHDU hdu = nom.tam.fits.Fits.MakeHDU(array);
    hdu.AddValue("BITPIX",16,null);  // set bit depth of 16 bit
    hdu.AddValue("NAXIS",2,null);    // 2D-image
    fits.AddHDU(hdu);                  // Debugging here shows correct HDU-data,i.e. gradient from top left to bottom right
    nom.tam.util.BufferedFile file = new nom.tam.util.BufferedFile(@"D:\test.fits",System.IO.FileAccess.ReadWrite,System.IO.FileShare.ReadWrite);
    fits.Write(file);  
    file.Flush();
    file.Close();
}

pixel-representation of 10-by-10-pixel FITS-file

正如人们所看到的,该代码生成一个16位图像,该图像从左上角到右下角具有灰度梯度。创建HDU后,其数据阵列的控制台输出将读取

655   1310  1965  2620  3275  3930  4585  5240  5895  6550
1310  2620  3930  5240  6550  7860  9170 10480 11790 13100
1965  3930  5895  7860  9825 11790 13755 15720 17685 19650
2620  5240  7860 10480 13100 15720 18340 20960 23580 26200
3275  6550  9825 13100 16375 19650 22925 26200 29475 32750
3930  7860 11790 15720 19650 23580 27510 31440 35370 39300
4585  9170 13755 18340 22925 27510 32095 36680 41265 45850
5240 10480 15720 20960 26200 31440 36680 41920 47160 52400
5895 11790 17685 23580 29475 35370 41265 47160 53055 58950
6550 13100 19650 26200 32750 39300 45850 52400 58950 65500

在最终图像中(在PixInsight中已查看,但是任何其他可显示FITS图像的程序也显示了相同的结果),每隔一列仅是值为0的像素,而每隔一行则重复第一行。

到目前为止,我尝试将HDU实际创建为ImageHDU,但没有任何效果。 我还检查了正确读取的FITS文件的HDU-header-fields,并尝试在我的系统中手动设置它们(使用hdu.AddValue),但到目前为止没有任何效果在这里https://csharp.hotexamples.com/examples/nom.tam.fits/Fits/Write/php-fits-write-method-examples.html)可以找到几个使用CSharpFITS编写FITS文件的示例,但是除了我所做的之外,没有其他使用。

建议深表感谢。谢谢!

解决方法

根据Iguananauts的评论,将int数组更改为short数组可得到预期的结果。