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); } }
/// <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); }
private static void ValidateConversion( JpegColorSpace colorSpace, int componentCount, int inputBufferLength, int resultBufferLength, int seed) { ValidateConversion( JpegColorConverter.GetConverter(colorSpace, 8), componentCount, inputBufferLength, resultBufferLength, seed); }
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); }
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); } }
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); } }
// 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); } } }
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); } }
/// <inheritdoc/> protected override JpegColorConverter GetColorConverter(JpegFrame frame, IRawJpegData jpegData) => JpegColorConverter.GetConverter(JpegColorSpace.RGB, frame.Precision);
/// <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);