Example #1
0
        /// <summary>
        /// Main Jpeg decode
        /// </summary>
        /// <param name="source">source bits</param>
        /// <param name="qf">Quality factor</param>
        /// <returns>decoded bytes</returns>
        public byte[] Decode(string source, int qf)
        {
            _blocks.Clear();
            _dctedBlocks.Clear();
            _quantizedBlocks.Clear();

            // construct RLE blocks
            List <RLEBlock> rleblocks = CodeWordEncoder.ReconstructRleBlocks(source);

            // inverse RLE
            _quantizedBlocks = _rlEncoder.Decode(rleblocks);

            //inverse quantization
            _quantizedBlocks.ForEach(quatizedBlock =>
            {
                IQuantize(quatizedBlock, qf);
                _dctedBlocks.Add(quatizedBlock);
            });

            // inverse dct
            _dctedBlocks.ForEach(dctedBlocks =>
            {
                var array = dctedBlocks.ToArray();
                CosineTransform.IDCT(array);
                var matrix = Matrix <double> .Build.DenseOfArray(array);
                matrix     = matrix.Add(128);
                _blocks.Add(matrix);
            });

            // reconstruct image from blocks
            return(Construct8x8Block(_blocks));
        }