Esempio n. 1
0
        public void ConvertFromCmyk(int inputBufferLength, int resultBufferLength, int seed)
        {
            var v     = new Vector4(0, 0, 0, 1F);
            var scale = new Vector4(1 / 255F, 1 / 255F, 1 / 255F, 1F);

            var converter = JpegColorConverter.GetConverter(JpegColorSpace.Cmyk);

            JpegColorConverter.ComponentValues values = CreateRandomValues(4, inputBufferLength, seed);
            var result = new Vector4[resultBufferLength];

            converter.ConvertToRGBA(values, result);

            for (int i = 0; i < resultBufferLength; i++)
            {
                float c = values.Component0[i];
                float m = values.Component1[i];
                float y = values.Component2[i];
                float k = values.Component3[i] / 255F;

                v.X = c * k;
                v.Y = m * k;
                v.Z = y * k;
                v.W = 1F;

                v *= scale;

                Vector4 rgba     = result[i];
                var     actual   = new Rgb(rgba.X, rgba.Y, rgba.Z);
                var     expected = new Rgb(v.X, v.Y, v.Z);

                Assert.True(actual.AlmostEquals(expected, Precision));
                Assert.Equal(1, rgba.W);
            }
        }
Esempio n. 2
0
        /// <inheritdoc/>
        public override void InjectFrameData(JpegFrame frame, IRawJpegData jpegData)
        {
            MemoryAllocator allocator = this.configuration.MemoryAllocator;

            // iteration data
            IJpegComponent c0 = frame.Components[0];

            const int blockPixelHeight = 8;

            this.blockRowsPerStep = c0.SamplingFactors.Height;
            this.pixelRowsPerStep = this.blockRowsPerStep * blockPixelHeight;

            // pixel buffer for resulting image
            this.pixelBuffer         = allocator.Allocate2D <TPixel>(frame.PixelWidth, frame.PixelHeight);
            this.paddedProxyPixelRow = allocator.Allocate <TPixel>(frame.PixelWidth + 3);

            // component processors from spectral to Rgba32
            var postProcessorBufferSize = new Size(c0.SizeInBlocks.Width * 8, this.pixelRowsPerStep);

            this.componentProcessors = new JpegComponentPostProcessor[frame.Components.Length];
            for (int i = 0; i < this.componentProcessors.Length; i++)
            {
                this.componentProcessors[i] = new JpegComponentPostProcessor(allocator, frame, jpegData, postProcessorBufferSize, frame.Components[i]);
            }

            // single 'stride' rgba32 buffer for conversion between spectral and TPixel
            // this.rgbaBuffer = allocator.Allocate<Vector4>(frame.PixelWidth);
            this.rgbBuffer = allocator.Allocate <byte>(frame.PixelWidth * 3);

            // color converter from Rgba32 to TPixel
            this.colorConverter = this.GetColorConverter(frame, jpegData);
        }
Esempio n. 3
0
 private static void ValidateConversion(
     JpegColorSpace colorSpace,
     int componentCount,
     int inputBufferLength,
     int resultBufferLength,
     int seed)
 {
     ValidateConversion(
         JpegColorConverter.GetConverter(colorSpace, 8),
         componentCount,
         inputBufferLength,
         resultBufferLength,
         seed);
 }
Esempio n. 4
0
        private static void ValidateConversion(
            JpegColorConverter converter,
            int componentCount,
            int inputBufferLength,
            int resultBufferLength,
            int seed)
        {
            JpegColorConverter.ComponentValues original = CreateRandomValues(componentCount, inputBufferLength, seed);
            JpegColorConverter.ComponentValues values   = Copy(original);

            converter.ConvertToRgbInplace(values);

            for (int i = 0; i < resultBufferLength; i++)
            {
                Validate(converter.ColorSpace, original, values, i);
            }
 private static void ValidateConversion(
     JpegColorConverter converter,
     int componentCount,
     int inputBufferLength,
     int resultBufferLength,
     int seed,
     Action <JpegColorConverter.ComponentValues, Span <Vector4>, int> validatePixelValue)
 {
     ValidateConversion(
         converter.ConvertToRGBA,
         componentCount,
         inputBufferLength,
         resultBufferLength,
         seed,
         validatePixelValue);
 }
Esempio n. 6
0
        private static void ValidateRgbToYCbCrConversion(
            JpegColorConverter converter,
            int componentCount,
            int inputBufferLength,
            int resultBufferLength,
            int seed)
        {
            JpegColorConverter.ComponentValues values = CreateRandomValues(componentCount, inputBufferLength, seed);
            var result = new Vector4[resultBufferLength];

            converter.ConvertToRGBA(values, result);

            for (int i = 0; i < resultBufferLength; i++)
            {
                ValidateYCbCr(values, result, i);
            }
        }
Esempio n. 7
0
        public void ConvertFromGrayScale(int inputBufferLength, int resultBufferLength, int seed)
        {
            var converter = JpegColorConverter.GetConverter(JpegColorSpace.Grayscale);

            JpegColorConverter.ComponentValues values = CreateRandomValues(1, inputBufferLength, seed);
            var result = new Vector4[resultBufferLength];

            converter.ConvertToRGBA(values, result);

            for (int i = 0; i < resultBufferLength; i++)
            {
                float   y        = values.Component0[i];
                Vector4 rgba     = result[i];
                var     actual   = new Rgb(rgba.X, rgba.Y, rgba.Z);
                var     expected = new Rgb(y / 255F, y / 255F, y / 255F);

                Assert.True(actual.AlmostEquals(expected, Precision));
                Assert.Equal(1, rgba.W);
            }
        }
Esempio n. 8
0
        // Benchmark, for local execution only
        // [Theory]
        // [InlineData(false)]
        // [InlineData(true)]
        public void BenchmarkYCbCr(bool simd)
        {
            int count = 2053;
            int times = 50000;

            JpegColorConverter.ComponentValues values = CreateRandomValues(3, count, 1);
            var result = new Vector4[count];

            JpegColorConverter converter = simd ? (JpegColorConverter) new JpegColorConverter.FromYCbCrVector4(8) : new JpegColorConverter.FromYCbCrBasic(8);

            // Warm up:
            converter.ConvertToRgbInplace(values);

            using (new MeasureGuard(this.Output, $"{converter.GetType().Name} x {times}"))
            {
                for (int i = 0; i < times; i++)
                {
                    converter.ConvertToRgbInplace(values);
                }
            }
        }
Esempio n. 9
0
        public void ConvertFromYcck(int inputBufferLength, int resultBufferLength, int seed)
        {
            var v     = new Vector4(0, 0, 0, 1F);
            var scale = new Vector4(1 / 255F, 1 / 255F, 1 / 255F, 1F);

            var converter = JpegColorConverter.GetConverter(JpegColorSpace.Ycck);

            JpegColorConverter.ComponentValues values = CreateRandomValues(4, inputBufferLength, seed);
            var result = new Vector4[resultBufferLength];

            converter.ConvertToRGBA(values, result);

            for (int i = 0; i < resultBufferLength; i++)
            {
                float y  = values.Component0[i];
                float cb = values.Component1[i] - 128F;
                float cr = values.Component2[i] - 128F;
                float k  = values.Component3[i] / 255F;

                v.X = (255F - (float)Math.Round(y + (1.402F * cr), MidpointRounding.AwayFromZero)) * k;
                v.Y = (255F - (float)Math.Round(
                           y - (0.344136F * cb) - (0.714136F * cr),
                           MidpointRounding.AwayFromZero)) * k;
                v.Z = (255F - (float)Math.Round(y + (1.772F * cb), MidpointRounding.AwayFromZero)) * k;
                v.W = 1F;

                v *= scale;

                Vector4 rgba     = result[i];
                var     actual   = new Rgb(rgba.X, rgba.Y, rgba.Z);
                var     expected = new Rgb(v.X, v.Y, v.Z);

                Assert.True(actual.AlmostEquals(expected, Precision));
                Assert.Equal(1, rgba.W);
            }
        }
Esempio n. 10
0
 /// <inheritdoc/>
 protected override JpegColorConverter GetColorConverter(JpegFrame frame, IRawJpegData jpegData) => JpegColorConverter.GetConverter(JpegColorSpace.RGB, frame.Precision);
Esempio n. 11
0
 /// <summary>
 /// Gets the color converter.
 /// </summary>
 /// <param name="frame">The jpeg frame with the color space to convert to.</param>
 /// <param name="jpegData">The raw JPEG data.</param>
 /// <returns>The color converter.</returns>
 public virtual JpegColorConverter GetColorConverter(JpegFrame frame, IRawJpegData jpegData) => JpegColorConverter.GetConverter(jpegData.ColorSpace, frame.Precision);