/// <summary> /// Encodes the image using a specified encoder. /// </summary> /// <param name="imageEncoder">The image encoder to use.</param> /// <returns>A new, corresponding encoded image.</returns> public EncodedImage Encode(IImageToStreamEncoder imageEncoder) { var encodedImage = new EncodedImage(this.Width, this.Height, this.PixelFormat); encodedImage.EncodeFrom(this, imageEncoder); return(encodedImage); }
/// <summary> /// Encodes a specified image with a specified encoder into the current encoded image. /// </summary> /// <param name="image">The image to encode.</param> /// <param name="imageEncoder">The image encoder to use.</param> /// <remarks>The image width, height and pixel format must match. The method should not be called concurrently.</remarks> public void EncodeFrom(Image image, IImageToStreamEncoder imageEncoder) { if (image.Width != this.Width || image.Height != this.Height || image.PixelFormat != this.PixelFormat) { throw new InvalidOperationException("Cannot encode from an image that has a different width, height, or pixel format."); } this.stream.Position = 0; imageEncoder.EncodeToStream(image, this.stream); }
/// <summary> /// Encodes a specified image with a specified encoder into the current encoded image. /// </summary> /// <param name="image">The image to encode.</param> /// <param name="imageEncoder">The image encoder to use.</param> /// <remarks>The image width, height and pixel format must match. The method should not be called concurrently.</remarks> public void EncodeFrom(Image image, IImageToStreamEncoder imageEncoder) { if (image.Width != this.Width || image.Height != this.Height || image.PixelFormat != this.PixelFormat) { throw new InvalidOperationException("Cannot encode from an image that has a different width, height, or pixel format."); } // reset the underlying MemoryStream - this also resets Position to 0 this.stream.SetLength(0); imageEncoder.EncodeToStream(image, this.stream); }
/// <summary> /// Encodes an image rectangle using a specified image encoder. /// </summary> /// <param name="source">The source stream of image rectangles.</param> /// <param name="encoder">The image encoder to use.</param> /// <param name="deliveryPolicy">An optional delivery policy.</param> /// <param name="name">An optional name for the stream operator.</param> /// <returns>A stream of encoded image rectangles.</returns> public static IProducer <EncodedImageRectangle3D> Encode( this IProducer <ImageRectangle3D> source, IImageToStreamEncoder encoder, DeliveryPolicy <ImageRectangle3D> deliveryPolicy = null, string name = null) { return(source.Process <ImageRectangle3D, EncodedImageRectangle3D>( (imageRectangle3D, envelope, emitter) => { var image = imageRectangle3D.Image.Resource; using var encodedImage = EncodedImagePool.GetOrCreate(image.Width, image.Height, image.PixelFormat); encodedImage.Resource.EncodeFrom(image, encoder); emitter.Post(new EncodedImageRectangle3D(imageRectangle3D.Rectangle3D, encodedImage), envelope.OriginatingTime); }, deliveryPolicy, name ?? $"{nameof(Encode)}({encoder.Description})")); }
/// <summary> /// Encodes an image camera view using a specified image encoder. /// </summary> /// <param name="source">The source stream of image camera views.</param> /// <param name="encoder">The image encoder to use.</param> /// <param name="deliveryPolicy">An optional delivery policy.</param> /// <param name="name">An optional name for the stream operator.</param> /// <returns>A stream of encoded image camera views.</returns> public static IProducer <EncodedImageCameraView> Encode( this IProducer <ImageCameraView> source, IImageToStreamEncoder encoder, DeliveryPolicy <ImageCameraView> deliveryPolicy = null, string name = null) { return(source.Process <ImageCameraView, EncodedImageCameraView>( (imageCameraView, envelope, emitter) => { var image = imageCameraView.ViewedObject.Resource; using var encodedImage = EncodedImagePool.GetOrCreate(image.Width, image.Height, image.PixelFormat); encodedImage.Resource.EncodeFrom(image, encoder); using var encodedImageCameraView = new EncodedImageCameraView(encodedImage, imageCameraView.CameraIntrinsics, imageCameraView.CameraPose); emitter.Post(encodedImageCameraView, envelope.OriginatingTime); }, deliveryPolicy, name ?? $"{nameof(Encode)}({encoder.Description})")); }
/// <summary> /// Initializes a new instance of the <see cref="ImageCompressor"/> class. /// </summary> /// <param name="compressionMethod">The image compression method to be used.</param> public ImageCompressor(CompressionMethod compressionMethod) { this.CompressionMethod = compressionMethod; switch (this.CompressionMethod) { case CompressionMethod.Jpeg: this.encoder = new ImageToJpegStreamEncoder { QualityLevel = 90 }; break; case CompressionMethod.Png: this.encoder = new ImageToPngStreamEncoder(); break; case CompressionMethod.None: break; } this.decoder = new ImageFromStreamDecoder(); }
/// <summary> /// Initializes a new instance of the <see cref="ImageEncoder"/> class. /// </summary> /// <param name="pipeline">The pipeline to add the component to.</param> /// <param name="encoder">The image encoder to use.</param> /// <param name="name">An optional name for the component.</param> public ImageEncoder(Pipeline pipeline, IImageToStreamEncoder encoder, string name = null) : base(pipeline, name ?? $"{nameof(ImageEncoder)}({encoder.Description})") { this.encoder = encoder; }
/// <summary> /// Initializes a new instance of the <see cref="ImageEncoder"/> class. /// </summary> /// <param name="pipeline">Pipeline to add this component to.</param> /// <param name="encoder">The image encoder to use.</param> public ImageEncoder(Pipeline pipeline, IImageToStreamEncoder encoder) : base(pipeline) { this.encoder = encoder; }