// openFITSMem: open a FITS memory buffer for reading and go to a useful HDU fitsfile *openFITSMem(void **buf, size_t *buflen, char *extlist, int *hdutype, int *status){ fitsfile *fptr; // open fits file fits_open_memfile(&fptr, MFILE, READONLY, buf, buflen, 0, NULL, status); // bail out if there is an error at this point if( *status ){ return NULL; } return gotoFITSHDU(fptr, extlist, hdutype, status); }
bool Camera_INDIClass::ReadFITS(usImage& img, bool takeSubframe, const wxRect& subframe) { int xsize, ysize; fitsfile *fptr; // FITS file pointer int status = 0; // CFITSIO status value MUST be initialized to zero! int hdutype, naxis; int nhdus=0; long fits_size[2]; long fpixel[3] = {1,1,1}; size_t bsize = static_cast<size_t>(cam_bp->bloblen); // load blob to CFITSIO if (fits_open_memfile(&fptr, "", READONLY, &(cam_bp->blob), &bsize, 0, NULL, &status) ) { pFrame->Alert(_("Unsupported type or read error loading FITS file")); return true; } if (fits_get_hdu_type(fptr, &hdutype, &status) || hdutype != IMAGE_HDU) { pFrame->Alert(_("FITS file is not of an image")); PHD_fits_close_file(fptr); return true; } // Get HDUs and size fits_get_img_dim(fptr, &naxis, &status); fits_get_img_size(fptr, 2, fits_size, &status); xsize = (int) fits_size[0]; ysize = (int) fits_size[1]; fits_get_num_hdus(fptr,&nhdus,&status); if ((nhdus != 1) || (naxis != 2)) { pFrame->Alert(_("Unsupported type or read error loading FITS file")); PHD_fits_close_file(fptr); return true; } if (takeSubframe) { if (img.Init(FullSize)) { pFrame->Alert(_("Memory allocation error")); PHD_fits_close_file(fptr); return true; } img.Clear(); img.Subframe = subframe; unsigned short *rawdata = new unsigned short[xsize*ysize]; if (fits_read_pix(fptr, TUSHORT, fpixel, xsize*ysize, NULL, rawdata, NULL, &status) ) { pFrame->Alert(_("Error reading data")); PHD_fits_close_file(fptr); return true; } int i = 0; for (int y = 0; y < subframe.height; y++) { unsigned short *dataptr = img.ImageData + (y + subframe.y) * img.Size.GetWidth() + subframe.x; memcpy(dataptr, &rawdata[i], subframe.width * sizeof(unsigned short)); i += subframe.width; } delete[] rawdata; } else { if (img.Init(xsize,ysize)) { pFrame->Alert(_("Memory allocation error")); PHD_fits_close_file(fptr); return true; } // Read image if (fits_read_pix(fptr, TUSHORT, fpixel, xsize*ysize, NULL, img.ImageData, NULL, &status) ) { pFrame->Alert(_("Error reading data")); PHD_fits_close_file(fptr); return true; } } PHD_fits_close_file(fptr); return false; }