/// <inheritdoc/> protected override void Receive(Shared <Image> sharedImage, Envelope e) { using var sharedEncodedImage = EncodedImagePool.GetOrCreate( sharedImage.Resource.Width, sharedImage.Resource.Height, sharedImage.Resource.PixelFormat); sharedEncodedImage.Resource.EncodeFrom(sharedImage.Resource, this.encoder); this.Out.Post(sharedEncodedImage, e.OriginatingTime); }
/// <inheritdoc/> public void Serialize(BufferWriter writer, Image instance, SerializationContext context) { // Note: encoder instances are created here because they (in the case of media foundation) may have thread affinity. BitmapEncoder encoder = null; switch (this.CompressionMethod) { case CompressionMethod.JPEG: encoder = new JpegBitmapEncoder { QualityLevel = 90 }; break; case CompressionMethod.PNG: encoder = new PngBitmapEncoder(); break; case CompressionMethod.None: break; } if (encoder != null) { using (var sharedEncodedImage = EncodedImagePool.GetOrCreate()) { ImageEncoder.EncodeFrom(sharedEncodedImage.Resource, instance, encoder); Serializer.Serialize(writer, sharedEncodedImage, context); } } else { Serializer.Serialize(writer, instance, context); } }
/// <summary> /// Pipeline callback function for encoding an image sample /// </summary> /// <param name="sharedImage">Image to be encoded</param> /// <param name="e">Pipeline information about the sample</param> protected override void Receive(Shared <Image> sharedImage, Envelope e) { // the encoder has thread affinity, so we need to re-create it (we can't dispatch the call since we sdon't know if the thread that created us is pumping messages) var encoder = this.encoderFn(); using (var sharedEncodedImage = EncodedImagePool.GetOrCreate()) { sharedEncodedImage.Resource.EncodeFrom(sharedImage.Resource, encoder); this.Out.Post(sharedEncodedImage, e.OriginatingTime); } }
/// <inheritdoc/> public void Serialize(BufferWriter writer, Image image, SerializationContext context) { if (this.encoder != null) { using var sharedEncodedImage = EncodedImagePool.GetOrCreate(image.Width, image.Height, image.PixelFormat); sharedEncodedImage.Resource.EncodeFrom(image, this.encoder); Serializer.Serialize(writer, sharedEncodedImage, context); } else { Serializer.Serialize(writer, image, context); } }
/// <summary> /// Given an image and stream, this method will compress the image using /// the compression method set in Initialize() /// </summary> /// <param name="writer">Stream to write compressed image to</param> /// <param name="instance">Image to be compressed</param> /// <param name="context">Serialization context</param> public void Serialize(BufferWriter writer, Image instance, SerializationContext context) { IBitmapEncoder encoder = null; switch (this.compressionMethod) { case Image.CustomSerializer.CompressionMethod.JPEG: encoder = new JpegBitmapEncoder { QualityLevel = 90 }; break; case Image.CustomSerializer.CompressionMethod.PNG: encoder = new PngBitmapEncoder(); break; } using (var sharedEncodedImage = EncodedImagePool.GetOrCreate()) { sharedEncodedImage.Resource.EncodeFrom(instance, encoder); Serializer.Serialize(writer, sharedEncodedImage, context); } }