/// <summary> /// Encodes the image with no chroma, just luminance. /// </summary> /// <typeparam name="TPixel">The pixel format.</typeparam> /// <param name="pixels">The pixel accessor providing access to the image pixels.</param> /// <param name="cancellationToken">The token to monitor for cancellation.</param> /// <param name="emitBufferBase">The reference to the emit buffer.</param> private void EncodeGrayscale <TPixel>(Image <TPixel> pixels, CancellationToken cancellationToken, ref byte emitBufferBase) where TPixel : unmanaged, IPixel <TPixel> { // TODO: Need a JpegScanEncoder<TPixel> class or struct that encapsulates the scan-encoding implementation. (Similar to JpegScanDecoder.) // (Partially done with YCbCrForwardConverter<TPixel>) Block8x8F temp1 = default; Block8x8F temp2 = default; Block8x8F onStackLuminanceQuantTable = this.luminanceQuantTable; var unzig = ZigZag.CreateUnzigTable(); // ReSharper disable once InconsistentNaming int prevDCY = 0; var pixelConverter = LuminanceForwardConverter <TPixel> .Create(); ImageFrame <TPixel> frame = pixels.Frames.RootFrame; Buffer2D <TPixel> pixelBuffer = frame.PixelBuffer; RowOctet <TPixel> currentRows = default; for (int y = 0; y < pixels.Height; y += 8) { cancellationToken.ThrowIfCancellationRequested(); currentRows.Update(pixelBuffer, y); for (int x = 0; x < pixels.Width; x += 8) { pixelConverter.Convert(frame, x, y, ref currentRows); prevDCY = this.WriteBlock( QuantIndex.Luminance, prevDCY, ref pixelConverter.Y, ref temp1, ref temp2, ref onStackLuminanceQuantTable, ref unzig, ref emitBufferBase); } } }
public void LoadAndStretchCorners_WithOffset <TPixel>(TestImageProvider <TPixel> provider) where TPixel : unmanaged, IPixel <TPixel> { using (Image <TPixel> s = provider.GetImage()) { var d = default(GenericBlock8x8 <TPixel>); RowOctet <TPixel> rowOctet = default; rowOctet.Update(s.GetRootFramePixelBuffer(), 7); d.LoadAndStretchEdges(s.Frames.RootFrame.PixelBuffer, 6, 7, ref rowOctet); Assert.Equal(s[6, 7], d[0, 0]); Assert.Equal(s[6, 8], d[0, 1]); Assert.Equal(s[7, 8], d[1, 1]); Assert.Equal(s[6, 9], d[0, 2]); Assert.Equal(s[6, 9], d[0, 3]); Assert.Equal(s[6, 9], d[0, 7]); Assert.Equal(s[7, 9], d[1, 2]); Assert.Equal(s[7, 9], d[1, 3]); Assert.Equal(s[7, 9], d[1, 7]); Assert.Equal(s[9, 9], d[3, 2]); Assert.Equal(s[9, 9], d[3, 3]); Assert.Equal(s[9, 9], d[3, 7]); Assert.Equal(s[9, 7], d[3, 0]); Assert.Equal(s[9, 7], d[4, 0]); Assert.Equal(s[9, 7], d[7, 0]); Assert.Equal(s[9, 9], d[3, 2]); Assert.Equal(s[9, 9], d[4, 2]); Assert.Equal(s[9, 9], d[7, 2]); Assert.Equal(s[9, 9], d[4, 3]); Assert.Equal(s[9, 9], d[7, 7]); } }
public void LoadAndStretchCorners_FromOrigo <TPixel>(TestImageProvider <TPixel> provider) where TPixel : unmanaged, IPixel <TPixel> { using (Image <TPixel> s = provider.GetImage()) { var d = default(GenericBlock8x8 <TPixel>); RowOctet <TPixel> rowOctet = default; rowOctet.Update(s.GetRootFramePixelBuffer(), 0); d.LoadAndStretchEdges(s.Frames.RootFrame.PixelBuffer, 0, 0, ref rowOctet); TPixel a = s.Frames.RootFrame[0, 0]; TPixel b = d[0, 0]; Assert.Equal(s[0, 0], d[0, 0]); Assert.Equal(s[1, 0], d[1, 0]); Assert.Equal(s[7, 0], d[7, 0]); Assert.Equal(s[0, 1], d[0, 1]); Assert.Equal(s[1, 1], d[1, 1]); Assert.Equal(s[7, 0], d[7, 0]); Assert.Equal(s[0, 7], d[0, 7]); Assert.Equal(s[7, 7], d[7, 7]); } }