private static bool LoadFitsFileInternal <TData>( string fileName, IFITSTimeStampReader timeStampReader, out TData[,] pixels, out TData medianValue, out Type pixelDataType, out float frameExposure, out bool hasNegativePixels, out short minRawValue, out uint maxVal, CheckOpenedFitsFileCallback callback, LoadFitsDataCallback <TData> loadDataCallback) { Fits fitsFile = new Fits(); using (BufferedFile bf = new BufferedFile(fileName, FileAccess.Read, FileShare.ReadWrite)) { fitsFile.Read(bf); BasicHDU imageHDU = fitsFile.GetHDU(0); Array pixelsArray = (Array)imageHDU.Data.DataArray; return(LoadFitsDataInternal <TData>( imageHDU, pixelsArray, fileName, timeStampReader, out pixels, out medianValue, out pixelDataType, out frameExposure, out hasNegativePixels, out minRawValue, out maxVal, callback, loadDataCallback)); } }
public static bool LoadFitsDataInternal <TData>( BasicHDU imageHDU, Array pixelsArray, string fileName, IFITSTimeStampReader timeStampReader, out TData[,] pixels, out TData medianValue, out Type pixelDataType, out float frameExposure, out bool hasNegativePixels, out short minRawValue, out uint maxVal, CheckOpenedFitsFileCallback callback, LoadFitsDataCallback <TData> loadDataCallback) { hasNegativePixels = false; if (callback != null && !(callback(imageHDU))) { pixels = new TData[0, 0]; medianValue = default(TData); pixelDataType = typeof(TData); frameExposure = 0; minRawValue = 0; maxVal = 0; return(false); } int bzero = GetBZero(imageHDU); bool isMidPoint; double?fitsExposure = null; try { ParseExposure(fileName, imageHDU.Header, timeStampReader, out isMidPoint, out fitsExposure); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); } frameExposure = fitsExposure.HasValue ? (float)fitsExposure.Value : 0; loadDataCallback(pixelsArray, imageHDU.Axes[0], imageHDU.Axes[1], bzero, out pixels, out medianValue, out pixelDataType, out hasNegativePixels, out minRawValue, out maxVal); return(true); }
public static void Load16BitFitsFile( string fileName, Load16BitFitsFileCallback loadFitsFileCallback, IFITSTimeStampReader timeStampReader, Action <BasicHDU> fitsFileLoadedCallback, out uint[] pixelsFlat, out int width, out int height, out int bpp, out DateTime?timestamp, out double?exposure, out short minPixelValue, out uint maxPixelValue, out bool hasNegativePixels, int negPixelCorrection = 0) { int pixWidth = 0; int pixHeight = 0; int pixBpp = 0; uint[,] pixels; uint medianValue; DateTime?fitsTimestamp = null; double? fitsExposure = null; Type pixelDataType = null; CheckOpenedFitsFileCallback checkFileCallback = delegate(BasicHDU imageHDU) { pixWidth = imageHDU.Axes[1]; pixHeight = imageHDU.Axes[0]; pixBpp = Math.Abs(imageHDU.BitPix); /* float and double are -32 and -64 respectively */ try { bool isMidPoint = false; fitsTimestamp = ParseExposure(fileName, imageHDU.Header, timeStampReader, out isMidPoint, out fitsExposure); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); } if (fitsFileLoadedCallback != null) { fitsFileLoadedCallback(imageHDU); } return(true); }; if (loadFitsFileCallback != null) { int overwrittenHeight; int overwrittenWidth; loadFitsFileCallback( fileName, timeStampReader, out pixels, out overwrittenWidth, out overwrittenHeight, out medianValue, out pixelDataType, out hasNegativePixels, out minPixelValue, out maxPixelValue, checkFileCallback ); width = overwrittenWidth; height = overwrittenHeight; } else { Load16BitFitsFile( fileName, timeStampReader, out pixels, out medianValue, out pixelDataType, out hasNegativePixels, out minPixelValue, out maxPixelValue, checkFileCallback, negPixelCorrection ); width = pixWidth; height = pixHeight; } pixelsFlat = new uint[width * height]; timestamp = fitsTimestamp; exposure = fitsExposure; uint mask = (uint)(((uint)1 << pixBpp) - 1); if (pixelDataType == typeof(float) || pixelDataType == typeof(double)) { mask = 0; pixBpp = 16; // Pretending float data is 16 bit. This is the maximum currently supported by Tangra } for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { uint val = pixels[x, y]; if (mask > 0) { val = val & mask; } pixelsFlat[x + y * width] = val; } } bpp = GetBppForMaxPixelValue(maxPixelValue); if (bpp == 32) { int shift = Math.Max(0, (int)Math.Ceiling(pixBpp / 16.0) - 1); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { pixelsFlat[x + y * width] = pixelsFlat[x + y * width] >> shift; } } bpp = 16; } }
public static bool Load16BitFitsFile(string fileName, IFITSTimeStampReader timeStampReader, out uint[,] pixels, out uint medianValue, out Type pixelDataType, out bool hasNegativePixels, out short minRawValue, out uint maxValue, CheckOpenedFitsFileCallback callback, int negPixelCorrection = 0) { float exposureSeconds; return(LoadFitsFileInternal <uint>(fileName, timeStampReader, out pixels, out medianValue, out pixelDataType, out exposureSeconds, out hasNegativePixels, out minRawValue, out maxValue, callback, (Array dataArray, int height, int width, double bzero, out uint[,] ppx, out uint median, out Type dataType, out bool hasNegPix, out short minV, out uint maxV) => { ppx = Load16BitImageData(dataArray, height, width, (int)bzero - negPixelCorrection, out median, out dataType, out hasNegPix, out minV, out maxV); })); }
public static bool LoadFloatingPointFitsFile(string fileName, IFITSTimeStampReader timeStampReader, out float[,] pixels, out float medianValue, out Type pixelDataType, out float exposureSeconds, out bool hasNegativePixels, CheckOpenedFitsFileCallback callback) { short minRawValue_discarded; uint maxVal_discarded; return(LoadFitsFileInternal <float>( fileName, timeStampReader, out pixels, out medianValue, out pixelDataType, out exposureSeconds, out hasNegativePixels, out minRawValue_discarded, out maxVal_discarded, callback, (Array dataArray, int height, int width, double bzero, out float[,] ppx, out float median, out Type dataType, out bool hasNegPix, out short minV, out uint maxV) => { float minFV_discarded; float maxFV_discarded; ppx = LoadFloatImageData(dataArray, height, width, (float)bzero, out median, out dataType, out hasNegPix, out minFV_discarded, out maxFV_discarded); minV = 0; maxV = 0; })); }