/// <summary> /// Renders a thumbnail of requested size from the center of the current image with /// filters applied. /// </summary> /// <param name="side">Side length of square thumbnail to render</param> /// <returns>Rendered thumbnail bitmap</returns> public async Task<Bitmap> RenderThumbnailBitmapAsync(int side) { int minSide = (int)Math.Min(Width, Height); Windows.Foundation.Rect rect = new Windows.Foundation.Rect() { Width = minSide, Height = minSide, X = (Width - minSide) / 2, Y = (Height - minSide) / 2, }; _session.AddFilter(FilterFactory.CreateCropFilter(rect)); Bitmap bitmap = new Bitmap(new Windows.Foundation.Size(side, side), ColorMode.Ayuv4444); try { await _session.RenderToBitmapAsync(bitmap, OutputOption.Stretch); } catch (Exception ex) { bitmap = null; } _session.Undo(); return bitmap; }
private async void ApplyExecute() { IsWorking = true; if (_editingSession == null || _noChanges) { return; } if (!CanApply) { _queued = true; return; } CanApply = false; _filterApplied = true; if (_filterApplied && _editingSession.CanUndo()) { try { _editingSession.Undo(); } catch (Exception e) { App.LogError(e); } } // apply filter to selected pixels only PreviewImage = new WriteableBitmap(ImageWidth, ImageHeight); _buffer.CopyTo(PreviewImage.Pixels, 0); using (var ms = PreviewImage.ToStream()) { var editingSession = await EditingSessionFactory.CreateEditingSessionAsync(ms); editingSession.AddFilter(SelectedFilter.Creator()); await editingSession.RenderToWriteableBitmapAsync(PreviewImage); } // remove unnecessary pixels //var removal = ClearTransparent ? Constants.White & 0xFFFFFF : Constants.White; // transparent white var removal = (0xFF << 24) | (Grayscale << 16) | (Grayscale << 8) | (Grayscale); for (var i = 0; i < PreviewImage.Pixels.Length; ++i) { if (_maskBuffer[i] == 0) { PreviewImage.Pixels[i] = removal; } if (_maskBuffer[i] != 0) { MainImage.Pixels[i] = ((Grayscale2 << 16) | (Grayscale2 << 8) | Grayscale2) | ((255 - _maskBuffer[i]) << 24); } else { MainImage.Pixels[i] = _backup.Pixels[i]; } } #if DEBUG try { using (var fileStream = _isoStore.CreateFile("MainImage.jpg")) MainImage.SaveJpeg(fileStream, ImageWidth, ImageHeight, 0, 100); using (var fileStream = _isoStore.CreateFile("PreviewImage.jpg")) PreviewImage.SaveJpeg(fileStream, ImageWidth, ImageHeight, 0, 100); } catch (Exception e) { App.LogError(e); } #endif using (var ms = MainImage.ToStream()) { Helpers.SafeDispose(ref _editingSession); _editingSession = await EditingSessionFactory.CreateEditingSessionAsync(ms); } using (var ms = PreviewImage.ToStream()) using (var blendingSession = await EditingSessionFactory.CreateEditingSessionAsync(ms)) { PreviewImage.Invalidate(); _editingSession.AddFilter(FilterFactory.CreateBlendFilter(blendingSession, SelectedBlendFunction)); var temp = new WriteableBitmap(MainImage.PixelWidth, MainImage.PixelHeight); await _editingSession.RenderToWriteableBitmapAsync(temp); MainImage = temp; if (SelectedTool != null) { SelectedTool.TargetImage = MainImage; } UndoCommand.RaiseCanExecuteChanged(); CanApply = true; } if (_queued) { _queued = false; ApplyExecute(); } IsWorking = false; }
private async void SplitImageFromBitmap(WriteableBitmap bmp) { _session = new EditingSession(bmp.AsBitmap()); if (playMode == PlayMode.CameraVideo) _session.AddFilter(FilterFactory.CreateStepRotationFilter(Rotation.Rotate90)); if (playMode == PlayMode.CameraVideo) _session.AddFilter(FilterFactory.CreateCropFilter(new Windows.Foundation.Rect(15, 20, 450, 600))); IFilter selectedFilter = GetFilter(); try { if (Utils.IsChallengeMode()) { foreach (Image img in images) { _session.AddFilter(FilterFactory.CreateCropFilter(new Windows.Foundation.Rect(images.IndexOf(img) % 3 * 150, images.IndexOf(img) / 3 * 150, 150, 150))); if (selectedFilter != null ) _session.AddFilter(selectedFilter); await _session.RenderToImageAsync(img, OutputOption.PreserveAspectRatio); if (selectedFilter != null && _session.CanUndo()) _session.Undo(); if (_session.CanUndo()) _session.Undo(); } } else { foreach (Image img in images) { _session.AddFilter(FilterFactory.CreateCropFilter(new Windows.Foundation.Rect(images.IndexOf(img) % 6 * 75, images.IndexOf(img) / 6 * 75, 75, 75))); if (selectedFilter != null) _session.AddFilter(selectedFilter); await _session.RenderToImageAsync(img, OutputOption.PreserveAspectRatio); if (selectedFilter != null && _session.CanUndo()) _session.Undo(); if (_session.CanUndo()) _session.Undo(); } } } catch (Exception exception) { MessageBox.Show("Exception:" + exception.Message); return; } if (playMode == PlayMode.CameraVideo) { processNextFrame(); } }