Windows平台下Fits格式文件读写C++库CCfits编译过程

作者的开发环境配置为:Win7+Qt5.14.2+VS2017,目的是编译CCfits库,但是它依赖于cfitsio库,而cfitsio库又依赖于zlib库。因此,完成CCfits库的编译需要完成以下3个库的编译:

1)zlib:zlib-1.2.11,zlib Home Site

2)cfitsio:cfitsio-4.0.0,FITSIO Home Page

3)CCfits:CCfits-2.6,CCfits: C++ Wrappers for the cfitsio library

编译库首先需要安装CMake,作者使用的版本是CMake 3.17.2,Windows下许多第三方跨平台库的编译均需要使用CMake,这里不赘述。另外,作者在最初的编译的过程中,总是编译失败,CMakeError.log中的错误提示为“LINK:fatal error LNK1104:无法打开文件“ucrtd.lib””,最终明确原因为“CMake未能明确Windows版本”,需要在编译时主动将Windows版本号作为参数传递给CMake,即增加“-DCMAKE_SYSTEM_VERSION=10.0.14393.0”,解决方法来自博客。在Windows下使用批处理的方式进行编译十分方便,下面作者给出编译3个库的完整编译批处理命令以及批处理文件路径截图:

1)编译zlib库

cd/d "%~dp0"
mkdir zlib.build
cd zlib.build
cmake -G "Visual Studio 15 2017 Win64" ..\zlib-1.2.11 -DCMAKE_INSTALL_PREFIX=c:\Users\zhoukehu\zlib -DCMAKE_SYSTEM_VERSION=10.0.14393.0
cmake --build . --config Release
cmake --install .
pause

Windows平台下Fits格式文件读写C++库CCfits编译过程_第1张图片

2)编译cfitsio库

cd/d "%~dp0"
mkdir cfitsio.build
cd cfitsio.build
cmake -G "Visual Studio 15 2017 Win64" ..\cfitsio-4.0.0 -DCMAKE_INSTALL_PREFIX=c:\Users\zhoukehu\cfitsio -DCMAKE_PREFIX_PATH=c:\Users\zhoukehu\zlib -DCMAKE_SYSTEM_VERSION=10.0.14393.0
cmake --build . --config Release
cmake --install .
pause

Windows平台下Fits格式文件读写C++库CCfits编译过程_第2张图片

3)编译 CCfits库

cd/d "%~dp0"
mkdir CCfits.build
cd CCfits.build
cmake -G "Visual Studio 15 2017 Win64" ..\CCfits-2.6 -DCMAKE_INSTALL_PREFIX=c:\Users\zhoukehu\CCfits -DCMAKE_PREFIX_PATH=c:\Users\zhoukehu\cfitsio -DCMAKE_SYSTEM_VERSION=10.0.14393.0
cmake --build . --config Release
cmake --install .
pause

Windows平台下Fits格式文件读写C++库CCfits编译过程_第3张图片

 作者将Win7下通过VS2017编译的x64版本的CCfits库分享出来(注意:最终编译的CCfits库只有lib库,而没有对应的dll,zlib库和cfitsio库则均包含了lib和dll):

链接:百度网盘 请输入提取码 
提取码:5mx4

作者根据CCfits库的文档编写了16位图像保存为Fits格式文件的代码,如下:

#include "CCfits/CCfits.h"
using namespace CCfits;


/**
 * @brief 将16位图像数据保存为Fits格式图像
 * @param pImg 图像数据指针
 * @param nWidth 图像宽度(单位:像素)
 * @param nHeight 图像高度(单位:像素)
 * @param strFilePath Fits图像保存路径,含后缀名(fits、fit等)
 * @param lfRA 保存的图像附加信息
 * @param lfDec 保存的图像附加信息
 * @return
 */
bool saveFits16UC1(uchar* pImg,ushort nWidth,ushort nHeight,QString strFilePath,double lfRA,double lfDec)
{
    //写FITS文件
    long naxis = 2;
    long naxes[2] = { nWidth, nHeight };
    FITS* pFits = nullptr;
    try
    {
        pFits = new FITS(strFilePath.toLocal8Bit().toStdString(), USHORT_IMG , naxis , naxes);
    }
    catch (FITS::CantCreate)
    {
        qDebug() << "FITS::CantCreate";
        return false ;
    }

    long nelements = nWidth*nHeight;
    long fpixel(1);
    std::valarray array((unsigned short*)pImg,nelements);
    pFits->pHDU().addKey("RA_TEL",lfRA,"Telescope R.A. in Equinox");
    pFits->pHDU().addKey("DEC_TEL",lfDec,"Telescope DEC. in Equinox");
    pFits->pHDU().write(fpixel,nelements,array);
    delete pFits;
    pFits = nullptr;

    return true;
}

你可能感兴趣的