/// <summary> /// Read image flags from the file /// </summary> public void ReadFlags(BufferReader reader, int offset) { CalibRange_min = reader.ReadSingleBE(offset + 92); CalibRange_max = reader.ReadSingleBE(offset + 96); Device = reader.ReadNullTerminatedString(offset + 142, 12); DeviceSerial = reader.ReadNullTerminatedString(offset + 186, 16); Optics = reader.ReadNullTerminatedString(offset + 202, 32); OpticsResolution = reader.ReadNullTerminatedString(offset + 234, 32); OpticsText = reader.ReadNullTerminatedString(offset + 554, 48); ShotRange_start_ERROR = reader.ReadSingleBE(offset + 532); ShotRange_size = reader.ReadSingleBE(offset + 536); TimeStamp_Raw = reader.ReadDoubleBE(8, offset + 540); TimeStampMilliseconds = reader.ReadIntBE(offset + 548); ImgAccu = reader.ReadWordBE(offset + 580); ZoomHorizontal = reader.ReadWordBE(offset + 596); ZoomVertical = reader.ReadWordBE(offset + 604); TimeStamp = Double2DateTime(TimeStamp_Raw, TimeStampMilliseconds); }
private float[,,] ReadVisibleImageData(BufferReader reader, int bindata_offset, int width, int height, int palette_offset, int useCompression) { int data_size = width * height; //- count of pixles bool useComp = (useCompression == 1); int pixelCount = data_size; float[] matrixData = new float[pixelCount]; int matrixDataPos = 0; int v1_pos = bindata_offset; int v2_pos = v1_pos + width * height; //- used if data are compressed //byte data_v1 = &bindata[v1_pos]; //unsigned char* data_v2 = &bindata[v2_pos]; int v1 = 0; int v2 = 0; int v3 = 0; int v4 = 0; var argb = 0; float v = 0; float f, f1, f2, f3; VisiblePalette = ReadVisiblePallet(reader, palette_offset); if (!useComp) { for (int i = pixelCount; i > 0; i--) { //- read value v1 = reader.ReadByte(v1_pos); v1_pos++; v2 = reader.ReadByte(v1_pos); v1_pos++; f1 = (float)v1 * (1.0f / 256.0f); f2 = (float)v2 * (1.0f / 256.0f); f3 = (float)v3 * (1.0f / 256.0f); //- lineare interpolation v = Palette[v1 + 1] * f1 + Palette[v2] * (1.0f - f1); //v1 v2 if (v < 0) { v = 0; //- oder 255 } matrixData[matrixDataPos] = v; matrixDataPos++; } } else { for (int i = pixelCount; i > 0; i--) { //- read value v1 = reader.ReadByte(v1_pos); v1_pos++; v2 = reader.ReadByte(v1_pos); v1_pos++; f1 = (float)v1 * (1.0f / 256.0f); f2 = (float)v2 * (1.0f / 256.0f); f3 = (float)v3 * (1.0f / 256.0f); //- lineare interpolation v = Palette[v2 + 1] * f1 + Palette[v1] * (1.0f - f1); //v1 v2 if (v < 0) { v = 0; //- oder 255 } matrixData[matrixDataPos] = v; matrixDataPos++; } } float[,] imageMatrix = new float[Width, Height]; for (matrixDataPos = 0; matrixDataPos < pixelCount; matrixDataPos++) { var i = matrixDataPos % Width; var j = matrixDataPos / Width; imageMatrix[i, j] = matrixData[matrixDataPos]; } var minValue = float.MaxValue; var maxValue = float.MinValue; for (int i = 0; i < Width; i++) { for (int j = 0; j < Height; j++) { maxValue = Math.Max(maxValue, imageMatrix[i, j]); minValue = Math.Min(minValue, imageMatrix[i, j]); } } var imageScale = 255.0f / (maxValue - minValue); for (int i = 0; i < Width; i++) { for (int j = 0; j < Height; j++) { imageMatrix[i, j] = (int)((imageMatrix[i, j] - minValue) * imageScale); } } float[,,] rgbImageMatrix = new float[Width, Height, 3]; for (int i = 1; i < Width - 1; i++) { for (int j = 1; j < Height - 1; j++) { //blue if (i % 2 == 0 && j % 2 == 0) { rgbImageMatrix[i, j, 0] = (imageMatrix[i - 1, j - 1] + imageMatrix[i - 1, j + 1] + imageMatrix[i + 1, j - 1] + imageMatrix[i + 1, j + 1]) / 4; rgbImageMatrix[i, j, 1] = (imageMatrix[i - 1, j] + imageMatrix[i, j - 1] + imageMatrix[i, j + 1] + imageMatrix[i + 1, j]) / 4; rgbImageMatrix[i, j, 2] = imageMatrix[i, j]; } //green if ((i % 2 == 0 && j % 2 != 0) || (i % 2 != 0 && j % 2 == 0)) { rgbImageMatrix[i, j, 2] = (imageMatrix[i - 1, j] + imageMatrix[i + 1, j]) / 2; rgbImageMatrix[i, j, 1] = imageMatrix[i, j]; rgbImageMatrix[i, j, 0] = (imageMatrix[i, j - 1] + imageMatrix[i, j + 1]) / 2; } //red if (i % 2 != 0 && j % 2 != 0) { rgbImageMatrix[i, j, 0] = imageMatrix[i, j]; rgbImageMatrix[i, j, 1] = (imageMatrix[i - 1, j] + imageMatrix[i, j - 1] + imageMatrix[i, j + 1] + imageMatrix[i + 1, j]) / 4; rgbImageMatrix[i, j, 2] = (imageMatrix[i - 1, j - 1] + imageMatrix[i - 1, j + 1] + imageMatrix[i + 1, j - 1] + imageMatrix[i + 1, j + 1]) / 4; //float[] mat = { rgbImageMatrix[i, j, 0], rgbImageMatrix[i, j, 1], rgbImageMatrix[i, j, 2] }; //var res = applySaturation(mat, 1.5f); //for (int k = 0; k < 3; k++) // rgbImageMatrix[i, j, k] = res[k]; } } } return(rgbImageMatrix); }
/// <summary> /// Read the image data from file /// </summary> /// <returns></returns> private float[] ReadImageData(BufferReader reader, int bindata_offset, int width, int height, int palette_offset, int useCompression) { int data_size = width * height; //- count of pixles bool useComp = (useCompression == 1); int pixelCount = data_size; float[] matrixData = new float[pixelCount]; int matrixDataPos = 0; int v1_pos = bindata_offset; int v2_pos = v1_pos + width * height; //- used if data are compressed //byte data_v1 = &bindata[v1_pos]; //unsigned char* data_v2 = &bindata[v2_pos]; int v1 = 0; int v2 = 0; Palette = ReadPallet(reader, palette_offset); int v2_count = 0; float v = 0; float f; if (!useComp) { for (int i = pixelCount; i > 0; i--) { //- read values v1 = reader.ReadByte(v1_pos); v1_pos++; v2 = reader.ReadByte(v1_pos); v1_pos++; f = (float)v1 * (1.0f / 256.0f); //- lineare interpolation v = Palette[v2 + 1] * f + Palette[v2] * (1.0f - f); if (v < 0) { v = 0; //- oder 255 } matrixData[matrixDataPos] = v; matrixDataPos++; } } else { for (int i = pixelCount; i > 0; i--) { //- werte lesen if (v2_count-- < 1) //- ok... neuen wert für V2 lesen { v2_count = reader.ReadByte(v2_pos) - 1; v2_pos++; v2 = reader.ReadByte(v2_pos); v2_pos++; } v1 = reader.ReadByte(v1_pos); v1_pos++; f = (float)v1 * (1.0f / 256.0f); //- lineare interpolation v = Palette[v2 + 1] * f + Palette[v2] * (1.0f - f); if (v < 0) { v = 0; //- oder 255 } matrixData[matrixDataPos] = v; matrixDataPos++; } } tempMatrix = new float[Width, Height]; for (matrixDataPos = 0; matrixDataPos < pixelCount; matrixDataPos++) { var i = matrixDataPos % Width; var j = matrixDataPos / Width; tempMatrix[i, j] = matrixData[matrixDataPos]; } return(matrixData); }
/// <summary> /// Read a image from the file /// </summary> public bool ReadImage(int imageIndex) { System.DateTime FrameTime = System.DateTime.Now; var reader = new BufferReader(this.reader.GetImageData(imageIndex)); if (reader.Eof) { return(false); } Width = 0; Height = 0; var i = 0; //- Image header BytePerPixel = reader.ReadWordBE(); Compressed = reader.ReadWordBE(); Width = reader.ReadWordBE(); Height = reader.ReadWordBE(); UpperLeftX = reader.ReadWordBE(); UpperLeftY = reader.ReadWordBE(); FirstValidX = reader.ReadWordBE(); LastValidX = reader.ReadWordBE(); FirstValidY = reader.ReadWordBE(); LastValidY = reader.ReadWordBE(); Position = reader.ReadSingleBE(); Emissivity = reader.ReadSingleBE(); Distanz = reader.ReadSingleBE(); EnvironmentalTemp = reader.ReadSingleBE(); AbsoConst = reader.ReadSingleBE(); PathTemperature = reader.ReadSingleBE(); Version = reader.ReadLongBE(); //for (int pos = 0; pos < 1567; pos++) // cbData[pos] = reader.ReadByte(); Level = reader.ReadSingleBE(); Span = reader.ReadSingleBE(); ImgTime = reader.ReadDoubleBE(8); ImgMilliTime = reader.ReadIntBE(); //TimeStamp = Double2DateTime(ImgTime, (int)ImgMilliTime); ImgAccu = reader.ReadWordBE(); ImageComment = reader.ReadStr(79, 0); ZoomHorizontal = reader.ReadSingleBE(); ZoomVertical = reader.ReadSingleBE(); i = reader.ReadWordBE(); i = reader.ReadWordBE(); i = reader.ReadWordBE(); i = reader.ReadWordBE(); if ((Width > 10000) || (Height > 10000)) { Width = 1; Height = 1; return(false); } this.ReadFlags(reader, 1084); Data = ReadImageData(reader, 0x6C0, Width, Height, 60, Compressed); if (reader.Eof) { return(false); } return(true); }