Example #1
0
        public async Task PrepareImageSequence(List <IImageProvider> imageProviders)
        {
            _unalignedImageProviders = imageProviders;
            _onScreenImageProviders  = _unalignedImageProviders;

            IAsyncImageResource asyncImageResource = (IAsyncImageResource)_unalignedImageProviders[0];
            var info = await asyncImageResource.LoadAsync();

            _unalignedImageWidth  = (int)info.ImageSize.Width;
            _unalignedImageHeight = (int)info.ImageSize.Height;

            using (ImageAligner imageAligner = new ImageAligner())
            {
                imageAligner.Sources         = _unalignedImageProviders;
                imageAligner.ReferenceSource = _unalignedImageProviders[0];

                try
                {
                    _alignedImageProviders = await imageAligner.AlignAsync();

                    asyncImageResource = (IAsyncImageResource)_unalignedImageProviders[0];
                    info = await asyncImageResource.LoadAsync();

                    _alignedImageWidth  = (int)info.ImageSize.Width;
                    _alignedImageHeight = (int)info.ImageSize.Height;
                    await EnableAlign();
                }
                catch (Exception)
                {
                    // If align fails, fail silently but don't enable the align button on UI
                }
            }
        }
Example #2
0
        private async void OnPreviewFrameAvailable(IAsyncImageResource imageResource)
        {
            if (!_isRendering)
            {
                _isRendering = true;
                await _writeableBitmapRenderer.RenderAsync();

                await
                CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
                    CoreDispatcherPriority.High,
                    () =>
                {
                    int bufferSize = _writeableBitmap.PixelWidth *_writeableBitmap.PixelHeight * 4;
                    if (_buffer == null || _buffer.Length != bufferSize)
                    {
                        _buffer = new byte[bufferSize];
                    }
                    IBuffer pixelBuffer = _writeableBitmap.PixelBuffer;
                    pixelBuffer.CopyTo(_buffer);

                    GCHandle handle = GCHandle.Alloc(_buffer, GCHandleType.Pinned);
                    using (
                        Mat m = new Mat(_writeableBitmap.PixelHeight, _writeableBitmap.PixelWidth,
                                        DepthType.Cv8U, 4,
                                        handle.AddrOfPinnedObject(), _writeableBitmap.PixelWidth * 4))
                        using (Mat gray = new Mat())
                            using (Mat canny = new Mat())
                            {
                                CvInvoke.CvtColor(m, gray, ColorConversion.Bgra2Gray);
                                CvInvoke.Canny(gray, canny, 40, 60);

                                CvInvoke.CvtColor(canny, m, ColorConversion.Gray2Bgra);
                            }
                    handle.Free();

                    using (Stream s = pixelBuffer.AsStream())
                    {
                        s.Write(_buffer, 0, _buffer.Length);
                    }

                    _writeableBitmap.Invalidate();
                });

                _isRendering = false;
            }
        }
Example #3
0
      private async void OnPreviewFrameAvailable(IAsyncImageResource imageResource)
      {
         if (!_isRendering && (imageResource != null))
         {
            _isRendering = true;
            await _writeableBitmapRenderer.RenderAsync();
            await
               Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
                  CoreDispatcherPriority.High,
                  () =>
                  {
                     int bufferSize = _writeableBitmap.PixelWidth * _writeableBitmap.PixelHeight * 4;
                     if (_buffer == null || _buffer.Length != bufferSize)
                        _buffer = new byte[bufferSize];
                     IBuffer pixelBuffer = _writeableBitmap.PixelBuffer;
                     pixelBuffer.CopyTo(_buffer);

                     GCHandle handle = GCHandle.Alloc(_buffer, GCHandleType.Pinned);
                     using (
                        Mat m = new Mat(_writeableBitmap.PixelHeight, _writeableBitmap.PixelWidth,
                           DepthType.Cv8U, 4,
                           handle.AddrOfPinnedObject(), _writeableBitmap.PixelWidth * 4))
                     using (Mat gray = new Mat())
                     using (Mat canny = new Mat())
                     {
                        CvInvoke.CvtColor(m, gray, ColorConversion.Bgr2Gray);
                        CvInvoke.Canny(gray, canny, 40, 60);
                        CvInvoke.CvtColor(canny, m, ColorConversion.Gray2Bgra);
                     }
                     handle.Free();
                     
                     using (Stream s = pixelBuffer.AsStream())
                     {
                        s.Write(_buffer, 0, _buffer.Length);
                     }
                    
                     _writeableBitmap.Invalidate();
                  });
            _isRendering = false; 
         }

      }
 private void OnPreviewFrameAvailable(IAsyncImageResource asyncImageResource)
 {
     _renderTask = Render();
 }
Example #5
0
        public static async Task Export(IReadOnlyList <IImageProvider> images, Rect?animatedArea)
        {
            // List of aligned images may contain Null items if the particular image couldn't be aligned
            List <IImageProvider> sanitizedImages = new List <IImageProvider>();

            foreach (IImageProvider image in images)
            {
                if (image != null)
                {
                    sanitizedImages.Add(image);
                }
            }

            IImageResource      info = null;
            IAsyncImageResource asyncImageResource = sanitizedImages[0] as IAsyncImageResource;

            if (asyncImageResource == null)
            {
                info = sanitizedImages[0] as IImageResource;
            }

            int w = (int)info.ImageSize.Width;
            int h = (int)info.ImageSize.Height;

            IReadOnlyList <IImageProvider> gifRendererSources;

            if (animatedArea.HasValue)
            {
                // Ensure the animated area dimensions are smaller than the image dimensions
                double rectW = animatedArea.Value.Width;
                double rectH = animatedArea.Value.Height;
                if ((animatedArea.Value.Width + animatedArea.Value.Left) >= w)
                {
                    rectW = w - animatedArea.Value.Left - 1;
                }
                if ((animatedArea.Value.Top + animatedArea.Value.Height) >= h)
                {
                    rectH = h - animatedArea.Value.Top - 1;
                }

                Rect rect = new Rect(animatedArea.Value.Left, animatedArea.Value.Top, rectW, rectH);
                gifRendererSources = CreateFramedAnimation(sanitizedImages, rect, w, h);
            }
            else
            {
                gifRendererSources = sanitizedImages;
            }

            using (GifRenderer gifRenderer = new GifRenderer())
            {
                gifRenderer.Duration = 100;
                gifRenderer.NumberOfAnimationLoops = 10000;
                gifRenderer.Sources = gifRendererSources;

                var buffer = await gifRenderer.RenderAsync();

                var filename    = "Sequence" + (await GetFileNameRunningNumber()) + ".gif";
                var storageFile = await KnownFolders.SavedPictures.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);

                using (var stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                    await stream.WriteAsync(buffer);
                }
            }
        }
 private void OnPreviewFrameAvailable(IAsyncImageResource asyncImageResource)
 {
     _renderTask = Render();
 }