int main(int argc, char **argv) { if (argc < 3) { fprintf(stderr,"test-read filename ext\n"); exit(EXIT_FAILURE); } fitsfile* fits=NULL; struct image *image=NULL; const char *fname=argv[1]; int ext = atoi(argv[2]); fprintf(stderr,"reading ext %d from %s\n",ext,fname); int status=0; if (fits_open_file(&fits, fname, READONLY, &status)) { fits_report_error(stderr, status); exit(EXIT_FAILURE); } int hdutype=0; if (fits_movabs_hdu(fits, ext+1, &hdutype, &status)) { fits_report_error(stderr, status); exit(EXIT_FAILURE); } int maxdim=CFITSIO_MAX_ARRAY_DIMS; LONGLONG dims[CFITSIO_MAX_ARRAY_DIMS]; int bitpix=0, ndims=0; if (fits_get_img_paramll(fits, maxdim, &bitpix, &ndims, dims, &status)) { fits_report_error(stderr, status); exit(EXIT_FAILURE); } if (ndims != 2) { fprintf(stderr,"expected ndims=2, got %d\n", ndims); goto _test_read_bail; } // dims reversed fprintf(stderr,"dims: [%lld,%lld]\n", dims[1], dims[2]); // note dims are reversed image=image_new(dims[1], dims[0]); long npix=dims[1]*dims[0]; long fpixel[2]={1,1}; if (fits_read_pix(fits, TDOUBLE, fpixel, npix, NULL,image->rows[0], NULL, &status)) { fits_report_error(stderr, status); exit(EXIT_FAILURE); } size_t row=0,col=0; row=10; col=13; fprintf(stderr,"im[%ld,%ld]: %.16g\n",row,col,IM_GET(image,row,col)); row=10; col=10; fprintf(stderr,"im[%ld,%ld]: %.16g\n",row,col,IM_GET(image,row,col)); row=18; col=24; fprintf(stderr,"im[%ld,%ld]: %.16g\n",row,col,IM_GET(image,row,col)); _test_read_bail: image=image_free(image); if (fits_close_file(fits, &status)) { fits_report_error(stderr, status); exit(EXIT_FAILURE); } }
static int vips_fits_get_header( VipsFits *fits, VipsImage *out ) { int status; int bitpix; int width, height, bands, format, type; int keysexist; int i; status = 0; if( fits_get_img_paramll( fits->fptr, 10, &bitpix, &fits->naxis, fits->naxes, &status ) ) { vips_fits_error( status ); return( -1 ); } #ifdef VIPS_DEBUG VIPS_DEBUG_MSG( "naxis = %d\n", fits->naxis ); for( i = 0; i < fits->naxis; i++ ) VIPS_DEBUG_MSG( "%d) %lld\n", i, fits->naxes[i] ); #endif /*VIPS_DEBUG*/ height = 1; bands = 1; switch( fits->naxis ) { /* If you add more dimensions here, adjust data read below. See also * the definition of MAX_DIMENSIONS above. */ case 10: case 9: case 8: case 7: case 6: case 5: case 4: for( i = fits->naxis; i > 3; i-- ) if( fits->naxes[i - 1] != 1 ) { vips_error( "fits", "%s", _( "dimensions above 3 " "must be size 1" ) ); return( -1 ); } case 3: bands = fits->naxes[2]; case 2: height = fits->naxes[1]; case 1: width = fits->naxes[0]; break; default: vips_error( "fits", _( "bad number of axis %d" ), fits->naxis ); return( -1 ); } /* Are we in one-band mode? */ if( fits->band_select != -1 ) bands = 1; /* Get image format. We want the 'raw' format of the image, our caller * can convert using the meta info if they want. */ for( i = 0; i < VIPS_NUMBER( fits2vips_formats ); i++ ) if( fits2vips_formats[i][0] == bitpix ) break; if( i == VIPS_NUMBER( fits2vips_formats ) ) { vips_error( "fits", _( "unsupported bitpix %d\n" ), bitpix ); return( -1 ); } format = fits2vips_formats[i][1]; fits->datatype = fits2vips_formats[i][2]; if( bands == 1 ) { if( format == VIPS_FORMAT_USHORT ) type = VIPS_INTERPRETATION_GREY16; else type = VIPS_INTERPRETATION_B_W; } else if( bands == 3 ) { if( format == VIPS_FORMAT_USHORT ) type = VIPS_INTERPRETATION_RGB16; else type = VIPS_INTERPRETATION_RGB; } else type = VIPS_INTERPRETATION_MULTIBAND; vips_image_pipelinev( out, VIPS_DEMAND_STYLE_SMALLTILE, NULL ); vips_image_init_fields( out, width, height, bands, format, VIPS_CODING_NONE, type, 1.0, 1.0 ); /* Read all keys into meta. */ if( fits_get_hdrspace( fits->fptr, &keysexist, NULL, &status ) ) { vips_fits_error( status ); return( -1 ); } for( i = 0; i < keysexist; i++ ) { char record[81]; char vipsname[100]; if( fits_read_record( fits->fptr, i + 1, record, &status ) ) { vips_fits_error( status ); return( -1 ); } VIPS_DEBUG_MSG( "fits2vips: setting meta on vips image:\n" ); VIPS_DEBUG_MSG( " record == \"%s\"\n", record ); /* FITS lets keys repeat. For example, HISTORY appears many * times, each time with a fresh line of history attached. We * have to include the key index in the vips name we assign. */ vips_snprintf( vipsname, 100, "fits-%d", i ); vips_image_set_string( out, vipsname, record ); } return( 0 ); }