Esempio n. 1
0
        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();
        }
Esempio n. 3
0
 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();
        }