/// <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)); }
/// <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))); }