예제 #1
0
        private void applyParameters(CompressionParameters parameters)
        {
            Debug.Assert(parameters is object);

            ClassicCompressor.SmoothingFactor = parameters.SmoothingFactor;
            ClassicCompressor.JpegSetQuality(parameters.Quality, true);
            if (parameters.SimpleProgressive)
            {
                ClassicCompressor.JpegSimpleProgression();
            }
        }
예제 #2
0
#pragma warning disable IDE1006 // Naming Styles
        private void applyParameters(CompressionParameters parameters)
#pragma warning restore IDE1006 // Naming Styles
        {
            Debug.Assert(parameters is object);

            ClassicCompressor.SmoothingFactor = parameters.SmoothingFactor;
            ClassicCompressor.JpegSetQuality(parameters.Quality, true);
            if (parameters.SimpleProgressive)
            {
                ClassicCompressor.JpegSimpleProgression();
            }
        }
예제 #3
0
        /// <summary>
        /// Compresses any image described as ICompressSource to JPEG
        /// </summary>
        /// <param name="source">Contains description of input image</param>
        /// <param name="output">Stream for output of compressed JPEG</param>
        public void Compress(IRawImage source, Stream output)
        {
            if (source is null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            if (output is null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            ClassicCompressor.Image_width      = source.Width;
            ClassicCompressor.Image_height     = source.Height;
            ClassicCompressor.In_color_space   = (JColorSpace)source.Colorspace;
            ClassicCompressor.Input_components = source.ComponentsPerPixel;
            //m_compressor.Data_precision = source.DataPrecision;

            ClassicCompressor.JpegSetDefaults();

            //we need to set density parameters after setting of default jpeg parameters
            //m_compressor.Density_unit = source.DensityUnit;
            //m_compressor.X_density = (short)source.DensityX;
            //m_compressor.Y_density = (short)source.DensityY;

            applyParameters(m_compressionParameters);

            // Specify data destination for compression
            ClassicCompressor.JpegStdioDest(output);

            // Start compression
            ClassicCompressor.JpegStartCompression(true);

            // Process  pixels
            source.BeginRead();
            while (ClassicCompressor.Next_scanline < ClassicCompressor.Image_height)
            {
                var row = source.GetPixelRow();
                var rowForDecompressor = new byte[1][];
                rowForDecompressor[0] = row ?? throw new InvalidDataException("Row of pixels is null");
                ClassicCompressor.JpegWriteScanlines(rowForDecompressor, 1);
            }

            source.EndRead();

            // Finish compression and release memory
            ClassicCompressor.JpegFinishCompress();
        }