c言語でcfitsioを用い、fitsファイルの読み込み

c言語でcfitsioを用い、fitsファイルを読み込ませるプログラムについて紹介します。

まぁとりあえず結論から。

ヘッダーファイルは

#include <fitsio.h>

ですね。

int main(int argc, char *argv[])

{

    int i,j,k,l;

    fitsfile *fptr;

    char card[FLEN_CARD];

    int status=0,nkeys,ii;

    int hdunum,hdutype,bitpix,naxis,maxdim,datatype,anynul;

    long naxes[10],fpixel[2],nelements,NAXIS1x,NAXIS1y;

    float nulval;

    fpixel[0]=1;fpixel[1]=1;//スタートのピクセルをx,y軸共に「1」スタートと設定する。

    

    fits_open_file (&fptr, argv[1], READONLY, &status);//fitsfileを開く

    fits_get_num_hdus(fptr,&hdunum,&status);//ヘッダーを読み込む

    fits_get_hdu_num(fptr,&hdunum);//ヘッダーの数を読み込む

    fits_get_hdu_type(fptr,&hdutype,&status);//ヘッダーのタイプを読み込む

    fits_get_img_type(fptr,&bitpix,&status);//「忘れた(笑)あんまり重要じゃなかった気がする。」

    fits_get_img_dim(fptr,&naxis,&status);//軸の数を読み込む(普通は2次元画像なので「2」)

    fits_get_img_size(fptr,naxis,&naxes[0],&status);//各軸のピクセル数を読み込む(軸の長さ)

    

    NAXIS1x=naxes[0];//x軸の長さ

    NAXIS1y=naxes[1];//y軸の長さ

    nelements=NAXIS1x*NAXIS1y;//総ピクセル数を計算

    

    float *array;

    array=(float*)malloc(nelements*sizeof(float));

    for(i=0;i<nelements;i++){

        array[i]=0;

    }//ここは、malloc関数を使って、仮想配列を作成

    

    fits_read_pix(fptr,TFLOAT,&fpixel[0],nelements,&nulval,&array[0],&anynul,&status);//ピクセルの値を読み込む。

    //「TFLOAT」がfloat型で読み込むということ。

    //「fpixel[0]」が各軸の始点の設定。

    //「nelements」が総ピクセル数。

    //「&nulval」はとりあえず入れとく。

    //「&array[0]」がピクセルの入るところ。

fits_close_file (fptr, &status);//fitsfileのクローズ

if (status)//もしstatusがあれば、

fits_report_error (stderr, status);//エラー番号を吐き出す。

 

    float coodi1[NAXIS1x][NAXIS1y];

    

    for(j=0;j<NAXIS1y;j++){

        for(i=0;i<NAXIS1x;i++){

            coodi1[i][j]=0;

            coodi1[i][j]=array[i+j*NAXIS1y];

        }

    }

    free(array);//mallocで作った関数のメモリ解放。

    

    return 0;

}

がプログラムになります。

詳しいことはcfitsioのmanualがネットに転がっているので、それを見ていただきたいのですが、エッセンスとやっていることは各行の右側に載せています。

 

読み込んだ「array[ ]」は1次元です。(fitsfileは1次元だから)

なので、2次元にするために「coodi1[ ][ ]」に書き換えています。

 

これで、coodi1[0][0]をprintfしてやれば、fitsファイルの(1,1)の値が出ると思います。

(c言語なのでfor文を(0,0)スタートにしていることに注意。)

 

これで、fitsファイルをc言語の配列で自在に操ることができます!!

 

書き出しやヘッダー情報の読み込みはまた後日。