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); }