cfitsio读取Fits文件 例程

fitsfile *fptr;             // FITS 文件指针
    int status = 0;             // CFITSIO 状态码
    int dataType = 0;
    int naxis;                  // 图像维度数组(宽+高+位深)
    long *naxes;                //存储(宽+高+位深);
    LONGLONG firstelem = 1;     // 要读取的第一个元素的索引(通常从1开始)
    LONGLONG nelements = 1;     // 要读取的元素数量(数据大小)
    void *data = nullptr;       //数据指针
    void *data_array = nullptr; // 指向数据的指针
    int *anynull = nullptr;     // 标记是否有缺失值
    int nkeys;                  //头信息数量
    char card[FLEN_CARD];       //文件信息
    int hudNum;                 //HUD数量
    int hdutype;                //HUD类型
    int bitpix;
 
fits_open_file(&fptr, filePath, READONLY, &status);
    if (status) {   //状态码不为 0(无错误) 时执行.
        fits_report_error(stderr, status);
        return;
    }

    //获取头信息数量
    fits_get_hdrspace(fptr, &nkeys, NULL, &status);
    //qDebug()<<"nkeys"<<nkeys;
    if (status) {   //状态码不为 0(无错误) 时执行
        fits_report_error(stderr, status);
        fits_close_file(fptr, &status);
        return;
    }else{
        // 获取头信息
        QStringList list;
        for (int ii = 1; ii <= nkeys; ii++)  {
            fits_read_record(fptr, ii, card, &status); /* read keyword */
            list.append(card);

        }
        qDebug()<<list;
        //fitsInfo.insert(filePath, list);
    }

    //获取HUD总数
    fits_get_num_hdus(fptr, &hudNum, &status);
    if (status) {   //状态码不为 0(无错误) 时执行
        fits_report_error(stderr, status);
        fits_close_file(fptr, &status);
        return;
    }

    for(int i = 1; i<=hudNum; ++i){
        //移动到包含图像数据的 HDU
        fits_movabs_hdu(fptr, i, NULL, &status); // 假设图像在第一个 HDU
        if (status) {
            fits_report_error(stderr, status);
            fits_close_file(fptr, &status);
            return;
        }


        fits_get_img_type(fptr, &bitpix, &status);
        qDebug()<<"bitpix:"<<bitpix;

        fits_get_hdu_type(fptr, &hdutype, &status);
        if(hdutype == IMAGE_HDU){
        // 获取图像的维度
        fits_get_img_dim(fptr, &naxis, &status);
        if (status) {
            fits_report_error(stderr, status);
            fits_close_file(fptr, &status);
            return;
        }

        naxes = new long[naxis];
        //qDebug()<< naxis;
        fits_get_img_size(fptr, naxis, naxes, &status);
        for (int i = 0; i < naxis; ++i) {
            // 计算要读取的数据大小
            nelements *= naxes[i];
            qDebug()<<"naxes["<<i<<"]"<<naxes[i];
        }
        qDebug()<<"nelements:"<< nelements;

        // 分配内存来存储图像数据
        // 假设图像是浮点数(FLOAT),你需要根据实际的图像类型来分配内存
        data_array = malloc(nelements * sizeof(unsigned short));
        if (!data_array) {
            // 内存分配失败处理
            fits_close_file(fptr, &status);
            return;
        }

        // 读取图像数据
        fits_read_img(fptr, TUSHORT, firstelem, nelements, 0, data_array, anynull, &status);
        if (status) {
            qDebug()<<"status:"<<status;
            fits_report_error(stderr, status);
            free(data_array);
            fits_close_file(fptr, &status);
            return;
        }else{
            qDebug()<<"succ";
            if(data_array == nullptr){
                qDebug()<<"acc";
            }
            QImage img((unsigned char*)data_array, naxes[0] , naxes[1], naxes[0] * 2, QImage::Format_Grayscale16); // 24位
            if(img.isNull()){
                qDebug()<<"img null";
                return;
            }
            //qDebug()<<"image size"<<img.size();
            Image_Show(img);
        }
        //释放内存并关闭文件
        free(data_array);
        fits_close_file(fptr, &status);
        }
    }
    fits_get_hdu_num(fptr, &hudNum);         //当前的HDU位置 从1开始
    qDebug()<<"HUD NUM:"<<hudNum;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值