public static IntegerMatrix ReadScanData(byte[] scanDataBytes, DhtHeader dhtHeader, Sof3Header sof3Header, SosHeader sosHeader, UInt16[] slices) { int columnsCount = GetImageWidth(slices); int rowsCount = sof3Header.LinesNumber; int rowIndex = 0, columnIndex = 0; IntegerMatrix resMatrix = new IntegerMatrix(rowsCount, columnsCount); ushort normalSliceWidth = slices[1]; List <int> decompressionValueList = new List <int>(); Dictionary <string, byte>[] huffmanCodeValueMapsArray = RawReader.GetHuffmanCodeValueMapsArray(dhtHeader); BitArray scanDataBitArray = RawReader.GetScanDataBitArray(scanDataBytes); int index = 0, huffmanCodeIndex = 0; BitArray huffmanCodeBitArray = new BitArray(1); string huffmanCodeString = null; byte huffmanValue = 0; int componentIndex = 0; int componentValueIndex = 0, componentValue = 0; int[] previousComponentValues = RawReader.GetInitialComponentValues(sof3Header); int lastIndex = GetLastDecompressionValueIndex(sof3Header, slices); int lastSliceFirstDecompressionValueIndex = GetLastSliceFirstDecompressionValueIndex(sof3Header, slices); int sliceSize = slices[1] * sof3Header.LinesNumber; Dictionary <string, byte> huffmanCodeValueMap = huffmanCodeValueMapsArray[GetHuffmanTableIndex(rowIndex, columnIndex, sosHeader)]; while (componentValueIndex <= lastIndex && index < scanDataBitArray.Length) { huffmanCodeBitArray[huffmanCodeIndex] = scanDataBitArray[index]; huffmanCodeString = huffmanCodeBitArray.ToBitString(); if (huffmanCodeValueMap.TryGetValue(huffmanCodeString, out huffmanValue)) { int differenceCodeValue = 0; index++; if (huffmanValue > 0) { //Read difference code int finalIndex = index + huffmanValue - 1; differenceCodeValue = GetDifferenceCodeValue(scanDataBitArray, index, finalIndex, huffmanValue); index = finalIndex + 1; } else { differenceCodeValue = 0; } componentValue = previousComponentValues[componentIndex] + differenceCodeValue; previousComponentValues[componentIndex] = componentValue; decompressionValueList.Add(componentValue); resMatrix[rowIndex, columnIndex] = componentValue; componentValueIndex++; huffmanCodeBitArray = new BitArray(1); huffmanCodeIndex = 0; rowIndex = GetNextRowIndex(componentValueIndex, lastSliceFirstDecompressionValueIndex, sliceSize, slices); columnIndex = GetNextColumnIndex(componentValueIndex, lastSliceFirstDecompressionValueIndex, sliceSize, slices); huffmanCodeValueMap = huffmanCodeValueMapsArray[GetHuffmanTableIndex(rowIndex, columnIndex, sosHeader)]; bool initComponentValuesRequired = (columnIndex == 0) || ((columnIndex > 0) && (columnIndex % normalSliceWidth == 0)); if (initComponentValuesRequired) { previousComponentValues = GetInitialComponentValues(sof3Header); } componentIndex = GetComponentIndex(rowIndex, columnIndex); } else { //Read huffman code index++; huffmanCodeIndex++; huffmanCodeBitArray.Length++; } } return(resMatrix); }