private uint DecodeSymbol() { Range = (ulong)(High - Low) + 1; uint code_sum = (uint)(((ulong)(Code - Low + 1) * arithmeticModel.GetSymbolTotalSum() - 1) / Range); uint symbol = arithmeticModel.GetSymbolForSpecifiedSum(code_sum); High = Low + (uint)((Range * arithmeticModel.GetSymbolSumLimitH(symbol)) / arithmeticModel.GetSymbolTotalSum() - 1); Low = Low + (uint)((Range * arithmeticModel.GetSymbolSumLimitL(symbol)) / arithmeticModel.GetSymbolTotalSum()); for (; ;) { if ((High & firstShiftingMask) == (Low & firstShiftingMask)) { Low <<= 1; High <<= 1; High |= 1; Code = (Code << 1) | reader.ReadNBits(1); } else if ((Low & secondShiftingMask) == 0x40000000 && (High & secondShiftingMask) == 0x80000000) { Code = ((Code ^ 0x40000000) << 1) | reader.ReadNBits(1); High = ((High | 0x40000000) << 1) | 1; Low = (Low & 0x3FFFFFFF) << 1; } else { break; } } return(symbol); }
public BmpFileObject(string filePath) { _image = new Bitmap(256, 256); _dataContainer = new byte[256, 256]; BitReader reader = new BitReader(filePath); for (int i = 0; i < _headerContainer.Length; i++) { _headerContainer[i] = (byte)reader.ReadNBits(8); } for (int i = 0; i < 256; i++) { for (int j = 0; j < 256; j++) { _dataContainer[i, j] = (byte)reader.ReadNBits(8); _image.SetPixel(j, 255 - i, Color.FromArgb(_dataContainer[i, j], _dataContainer[i, j], _dataContainer[i, j])); } } reader.Dispose(); }
public ArithmeticDecoder(BitReader reader) { this.reader = reader; Code = reader.ReadNBits(32); arithmeticModel = new ArithmeticModel(TOTAL_SYMBOLS); }
public BmpFileObject(string filePath, ref int kReconstructError, ref int selectedPredictor) { _dataContainerEncoded = new int[256, 256]; BitReader reader = new BitReader(filePath); for (int i = 0; i < _headerContainer.Length; i++) { _headerContainer[i] = (byte)reader.ReadNBits(8); } selectedPredictor = (int)reader.ReadNBits(4); kReconstructError = (int)reader.ReadNBits(4); var saveMode = (int)reader.ReadNBits(2); switch (saveMode) { case 0: { for (int i = 0; i < 256; i++) { for (int j = 0; j < 256; j++) { _dataContainerEncoded[i, j] = (int)reader.ReadNBits(9) - 255; } } break; } case 1: { for (int i = 0; i < 256; i++) { for (int j = 0; j < 256; j++) { var index = 0; var lineNumber = 0; while (reader.ReadNBits(1) == 1) { lineNumber++; } if (lineNumber == 0) { _dataContainerEncoded[i, j] = 0; } else { index = (int)reader.ReadNBits(lineNumber); if (index >= (1 << (lineNumber - 1))) { _dataContainerEncoded[i, j] = index; } else { _dataContainerEncoded[i, j] = index - (1 << lineNumber) + 1; } } } } break; } case 2: { var intDecodedValuesList = ArithmeticDecoder.DecompressData(reader); _dataContainerEncoded = Helpers.BuildMatrixFromListArithmetic(intDecodedValuesList); break; } default: break; } reader.Dispose(); }