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));
        }
Example #2
0
        /// <summary>
        /// Main Jpeg encode
        /// </summary>
        /// <param name="source">source data</param>
        /// <param name="qf">quality factor</param>
        /// <returns>encoded bytes</returns>
        public byte[] Encode(byte[] source, int qf)
        {
            // divide into 8x8
            Divide8x8Block(source);

            // do dct for every 8x8 block
            _blocks.ForEach(block =>
            {
                block     = block.Subtract(128);
                var array = block.ToArray();
                CosineTransform.DCT(array);
                var matrix = Matrix <double> .Build.DenseOfArray(array);
                _dctedBlocks.Add(matrix);
            });

            // do quantization
            _dctedBlocks.ForEach(dctedBlocks =>
            {
                Quantize(dctedBlocks, qf);
                _quantizedBlocks.Add(dctedBlocks);
            });

            // do RLE
            List <RLEBlock> rleBlocks = _rlEncoder.Encode(_quantizedBlocks);

            // construct code word by RLE
            return(Utility.BoolArrayToByteArray(CodeWordEncoder.ConstructCodeWord(rleBlocks)));
        }