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言語の配列で自在に操ることができます!!
書き出しやヘッダー情報の読み込みはまた後日。