public static byte[] SaveFile(FileFormat fileFormat) { SPAHeader mainheader = new SPAHeader(); //填充光谱文件信息 mainheader.dataCount = fileFormat.fileInfo.dataCount; mainheader.resolution = (int)(32768 / fileFormat.fileInfo.resolution); mainheader.firstx = (float)fileFormat.dataInfo.firstX; mainheader.lastx = (float)fileFormat.dataInfo.lastX; if (fileFormat.dataInfo.dataType == FileFormat.YAXISTYPE.YABSRB) { mainheader.yType = 0x0C; } else if (fileFormat.dataInfo.dataType == FileFormat.YAXISTYPE.YSCRF) { mainheader.yType = 0x0F; } mainheader.bgGrain = (float)fileFormat.acquisitionInfo.GAIN; mainheader.lwn = (float)fileFormat.acquisitionInfo.LWN; mainheader.sampleScans = fileFormat.acquisitionInfo.SCANS; mainheader.bgScans = fileFormat.acquisitionInfo.SCANSBG; //读取光谱参数 InstrumentHeader instPara = new InstrumentHeader(); instPara.highFilter = (float)fileFormat.acquisitionInfo.HIGHPASS; instPara.lowFilter = (float)fileFormat.acquisitionInfo.LOWPASS; return(CreateFile(mainheader, instPara, fileFormat.yDatas, fileFormat.fileInfo.fileMemo, fileFormat.fileInfo.instDescription)); }
private static byte[] CreateFile(SPAHeader xPara, InstrumentHeader instPara, double[] yDatas, string fileTitle, string instSN) { IntPtr retptr = IntPtr.Zero; int datasize = 0; try { byte[] titleBytes = null; if (!string.IsNullOrWhiteSpace(fileTitle)) { titleBytes = Encoding.Default.GetBytes(fileTitle); } if (CommonMethod.Is64BitVersion()) { retptr = SPACreateFile64(ref xPara, ref instPara, yDatas, titleBytes, titleBytes == null ? 0 : titleBytes.Length, instSN, ref datasize); } else { retptr = SPACreateFile32(ref xPara, ref instPara, yDatas, titleBytes, titleBytes == null ? 0 : titleBytes.Length, instSN, ref datasize); } return(CommonMethod.CopyDataArrayFromIntptrAndFree <byte>(ref retptr, datasize)); } catch (Exception ex) { ErrorString = ex.Message; return(null); } }
/// <summary> /// 读取SPC文件头 /// </summary> /// <param name="fileData">文件数据</param> /// <param name="fileSize">文件大小</param> /// <returns>SPCHeader结构</returns> private static SPAHeader GetXHeader(byte[] fileData, int fileSize) { try { IntPtr retptr = IntPtr.Zero; int datasize = 0; if (CommonMethod.Is64BitVersion()) { retptr = SPAGetXHeader64(fileData, fileSize, ref datasize); } else { retptr = SPAGetXHeader32(fileData, fileSize, ref datasize); } bool retOK; SPAHeader retheader = CommonMethod.CopyStructureFromIntptrAndFree <SPAHeader>(ref retptr, out retOK); if (!retOK) { retheader.dataCount = int.MaxValue; //表示错误数据 } return(retheader); } catch (Exception ex) { ErrorString = ex.Message; SPAHeader retheader = new SPAHeader(); retheader.dataCount = int.MaxValue; //表示错误数据 return(retheader); } }
public HeaderViewModel() { header = new SPAHeader(DateTime.Now.AddDays(-3)); // header.Creater = "Bhv"; // header.Creater = "Bhv"; //Attachments = //new List<Attachments> { new Attachments { Filename = "test.txt", FileSize = "10mb", Creater = "B" }, // new Attachments { Filename = "test2.txt", FileSize = "120mb", Creater = "2B" } //}; }
/// <summary> /// 读取光谱文件 /// </summary> public static bool ReadFile(byte[] fileData, int fileSize, FileFormat fileFormat) { fileFormat.dataInfoList = null; fileFormat.acquisitionInfo = null; fileFormat.xDataList = null; fileFormat.fileInfo = null; fileFormat.yDataList = null; SPAHeader mainheader = GetXHeader(fileData, fileSize); if (mainheader.dataCount == int.MaxValue) //读取文件头错误 { return(false); } //填充光谱文件信息 fileFormat.fileInfo = new FileFormat.FileInfo(); //fileFormat.fileInfo.createTime = CommonMethod.DWordToDateTime(0xD9A36D78); fileFormat.fileInfo.dataCount = (int)mainheader.dataCount; fileFormat.fileInfo.fileMemo = GetFileTitle(fileData, fileSize); fileFormat.fileInfo.instDescription = GetInstSN(fileData, fileSize); fileFormat.fileInfo.modifyFlag = 0; fileFormat.fileInfo.resolution = mainheader.resolution == 0 ? 4.0 : 32768 / mainheader.resolution; fileFormat.fileInfo.specType = FileFormat.SPECTYPE.SPCNIR; //固定值 fileFormat.fileInfo.xType = FileFormat.XAXISTYPE.XWAVEN; //mainheader.xType = 1 fileFormat.fileInfo.zType = FileFormat.ZAXISTYPE.XMSEC; //固定值 fileFormat.fileInfo.fzinc = 0.5f; //固定值 fileFormat.fileInfo.fspare = new float[8]; //固定值 //读取X轴数据(肯定是均匀的X轴) fileFormat.xDataList = new List <double[]>(); double[] tempx = new double[mainheader.dataCount]; double stepx = (mainheader.lastx - mainheader.firstx) / (tempx.Length - 1); for (int i = 0; i < tempx.Length; i++) { tempx[i] = mainheader.firstx + i * stepx; } fileFormat.xDataList.Add(tempx); //获取Y数据以及格式信息 fileFormat.dataInfoList = new List <FileFormat.DataInfo>(); fileFormat.yDataList = new List <double[]>(); //读取Y轴数据 double[] ydata = GetYData(fileData, fileSize); if (ydata == null || ydata.Length == 0) { return(false); } //Y轴数据格式 FileFormat.DataInfo info = new FileFormat.DataInfo(); info.dataType = mainheader.yType == 0x0C ? FileFormat.YAXISTYPE.YABSRB : (mainheader.yType == 0x0F ? FileFormat.YAXISTYPE.YSCRF : FileFormat.YAXISTYPE.YSCSM); info.firstX = mainheader.firstx; info.lastX = mainheader.lastx; info.maxYValue = ydata.Max(); info.minYValue = ydata.Min(); fileFormat.dataInfoList.Add(info); fileFormat.yDataList.Add(ydata); InstrumentHeader instHeader = GetInstrumentHeader(fileData, fileSize); //读取光谱参数 fileFormat.acquisitionInfo = new FileFormat.AcquisitionInfo(); fileFormat.acquisitionInfo.GAIN = mainheader.bgGrain; fileFormat.acquisitionInfo.HIGHPASS = instHeader.highFilter; fileFormat.acquisitionInfo.LOWPASS = instHeader.lowFilter; fileFormat.acquisitionInfo.LWN = mainheader.lwn; fileFormat.acquisitionInfo.SPEED = instHeader.speed.ToString(); fileFormat.acquisitionInfo.SCANS = mainheader.sampleScans; fileFormat.acquisitionInfo.SCANSBG = mainheader.bgScans; fileFormat.acquisitionInfo.IRMODE = FileFormat.enumIRMODE.NearIR; return(true); }
private static extern IntPtr SPACreateFile64(ref SPAHeader xDataPara, ref InstrumentHeader instPara, double[] yDatas, byte[] fileTitle, int titleSize, string instSN, ref int outDataSize);