/// <summary> /// Converts the stream of image camera views to a different pixel format. /// </summary> /// <param name="source">The source stream of image camera views.</param> /// <param name="scaleX">Scale factor for X.</param> /// <param name="scaleY">Scale factor for Y.</param> /// <param name="samplingMode">Method for sampling pixels when rescaling.</param> /// <param name="deliveryPolicy">An optional delivery policy.</param> /// <param name="sharedImageAllocator">Optional image allocator for creating new shared images.</param> /// <param name="name">An optional name for the stream operator.</param> /// <returns>The resulting stream.</returns> public static IProducer <ImageCameraView> Scale( this IProducer <ImageCameraView> source, float scaleX, float scaleY, SamplingMode samplingMode = SamplingMode.Bilinear, DeliveryPolicy <ImageCameraView> deliveryPolicy = null, Func <int, int, PixelFormat, Shared <Image> > sharedImageAllocator = null, string name = nameof(Scale)) { sharedImageAllocator ??= (width, height, pixelFormat) => ImagePool.GetOrCreate(width, height, pixelFormat); return(source.Process <ImageCameraView, ImageCameraView>( (imageCameraView, envelope, emitter) => { // if the image is null, post null if (imageCameraView == null) { emitter.Post(null, envelope.OriginatingTime); } else { int finalWidth = (int)(imageCameraView.ViewedObject.Resource.Width * scaleX); int finalHeight = (int)(imageCameraView.ViewedObject.Resource.Height * scaleY); using var scaledSharedImage = sharedImageAllocator(finalWidth, finalHeight, imageCameraView.ViewedObject.Resource.PixelFormat); imageCameraView.ViewedObject.Resource.Scale(scaledSharedImage.Resource, scaleX, scaleY, samplingMode); using var outputImageCameraView = new ImageCameraView(scaledSharedImage, imageCameraView.CameraIntrinsics, imageCameraView.CameraPose); emitter.Post(outputImageCameraView, envelope.OriginatingTime); } }, deliveryPolicy, name)); }
/// <summary> /// Converts the stream of image camera views to a different pixel format. /// </summary> /// <param name="source">The source stream of image camera views.</param> /// <param name="pixelFormat">The pixel format to convert to.</param> /// <param name="deliveryPolicy">An optional delivery policy.</param> /// <param name="sharedImageAllocator">Optional image allocator for creating new shared images.</param> /// <param name="name">An optional name for the stream operator.</param> /// <returns>The resulting stream.</returns> public static IProducer <ImageCameraView> Convert( this IProducer <ImageCameraView> source, PixelFormat pixelFormat, DeliveryPolicy <ImageCameraView> deliveryPolicy = null, Func <int, int, PixelFormat, Shared <Image> > sharedImageAllocator = null, string name = nameof(Convert)) { sharedImageAllocator ??= (width, height, pixelFormat) => ImagePool.GetOrCreate(width, height, pixelFormat); return(source.Process <ImageCameraView, ImageCameraView>( (imageCameraView, envelope, emitter) => { // if the image is null, post null if (imageCameraView == null) { emitter.Post(null, envelope.OriginatingTime); } else if (pixelFormat == imageCameraView.ViewedObject.Resource.PixelFormat) { // o/w if image is already in the requested format, shortcut the conversion emitter.Post(imageCameraView, envelope.OriginatingTime); } else { using var image = sharedImageAllocator(imageCameraView.ViewedObject.Resource.Width, imageCameraView.ViewedObject.Resource.Height, pixelFormat); imageCameraView.ViewedObject.Resource.CopyTo(image.Resource); using var outputImageCameraView = new ImageCameraView(image, imageCameraView.CameraIntrinsics, imageCameraView.CameraPose); emitter.Post(outputImageCameraView, envelope.OriginatingTime); } }, deliveryPolicy, name)); }
/// <summary> /// Decodes an encoded image camera view using a specified image decoder. /// </summary> /// <param name="source">The source stream of encoded image camera views.</param> /// <param name="decoder">The image decoder 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 decoded image camera views.</returns> public static IProducer <ImageCameraView> Decode( this IProducer <EncodedImageCameraView> source, IImageFromStreamDecoder decoder, DeliveryPolicy <EncodedImageCameraView> deliveryPolicy = null, string name = nameof(Decode)) { return(source.Process <EncodedImageCameraView, ImageCameraView>( (encodedImageCameraView, envelope, emitter) => { var encodedImage = encodedImageCameraView.ViewedObject.Resource; using var image = ImagePool.GetOrCreate(encodedImage.Width, encodedImage.Height, encodedImage.PixelFormat); image.Resource.DecodeFrom(encodedImage, decoder); using var imageCameraView = new ImageCameraView(image, encodedImageCameraView.CameraIntrinsics, encodedImageCameraView.CameraPose); emitter.Post(imageCameraView, envelope.OriginatingTime); }, deliveryPolicy, name)); }