作者的开发环境配置为: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
?
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
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
?作者将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<unsigned short> 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;
}
|