private async void DataTransferManager_DataRequestedAsync(DataTransferManager manager, DataRequestedEventArgs args) { try { DataRequest request = args.Request; request.Data.Properties.Title = "Share image"; request.Data.Properties.Description = ""; var deferal = request.GetDeferral(); //TODO regionalise text //generate the bitmap Load.Show(); var result = ApplyImageEffect8bitsNoHistoAsync(rawImage.fullSize, EditionValue); InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream(); BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream); //Needs to run in the UI thread because f**k performance await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { encoder.SetSoftwareBitmap(result); }); await encoder.FlushAsync(); encoder = null; result.Dispose(); Load.Hide(); request.Data.SetBitmap(RandomAccessStreamReference.CreateFromStream(stream)); deferal.Complete(); } catch (Exception e) { TextDisplay.DisplayError(e.Message); } }
private void OpenFile(StorageFile file) { //Add a loading screen if (rawImage != null) { EmptyImage(); } Load.Show(); ImageSelected = true; isBindingEnabled = false; Task.Run(async () => { try { var watchTotal = Stopwatch.StartNew(); using (Stream stream = (await file.OpenReadAsync()).AsStreamForRead()) { var watchdecode = Stopwatch.StartNew(); RawDecoder decoder = RawParser.GetDecoder(stream, file); try { thumbnail = decoder.DecodeThumb(); Task.Run(() => { var result = thumbnail?.GetBitmap(); DisplayImage(result, true); }); } //since thumbnail are optionnal, we ignore all errors catch (Exception ex) { } decoder.DecodeRaw(); decoder.DecodeMetadata(); rawImage = decoder.rawImage; watchdecode.Stop(); Debug.WriteLine("Decoding done in " + watchdecode.ElapsedMilliseconds + " ms"); var watchLook = Stopwatch.StartNew(); rawImage.ApplyTableLookUp(); watchLook.Stop(); Debug.WriteLine("Lookup done in " + watchLook.ElapsedMilliseconds + " ms"); var watchScale = Stopwatch.StartNew(); ImageHelper.ScaleValues(rawImage); watchScale.Stop(); Debug.WriteLine("Scale done in " + watchScale.ElapsedMilliseconds + " ms"); } rawImage.metadata.SetFileMetatdata(file); if (rawImage.isCFA) { var watchDemos = Stopwatch.StartNew(); //get the algo from the settings DemosaicAlgorithm algo; try { algo = SettingStorage.DemosAlgo; } catch (Exception) { algo = DemosaicAlgorithm.FastAdams; } Demosaic.Demos(rawImage, algo); watchDemos.Stop(); Debug.WriteLine("Demos done in " + watchDemos.ElapsedMilliseconds + " ms"); } if (rawImage.convertionM != null) { var watchConvert = Stopwatch.StartNew(); rawImage.ConvertRGB(); watchConvert.Stop(); Debug.WriteLine("ConvertRGB done in " + watchConvert.ElapsedMilliseconds + " ms"); } var watchPreview = Stopwatch.StartNew(); ImageHelper.CreatePreview(SettingStorage.PreviewFactor, ImageDisplay.ViewportHeight, ImageDisplay.ViewportWidth, rawImage); watchPreview.Stop(); Debug.WriteLine("Preview done in " + watchPreview.ElapsedMilliseconds + " ms"); watchTotal.Stop(); rawImage.metadata.ParsingTime = watchTotal.ElapsedMilliseconds; GC.Collect(); //check if enough memory if (MemoryManager.AppMemoryUsageLimit - MemoryManager.AppMemoryUsage < ((ulong)rawImage.fullSize.green.Length * 6) || MemoryManager.AppMemoryUsageLevel == AppMemoryUsageLevel.High) { TextDisplay.DisplayWarning("The image is bigger than what your device support, this application may fail when saving. Only " + ((MemoryManager.AppMemoryUsageLimit - MemoryManager.AppMemoryUsage) / (1024 * 1024)) + "Mb left of memory for this app to use"); } #if !DEBUG //send an event with file extension, camera model and make logger.Log("SuccessOpening " + rawImage?.metadata?.FileExtension.ToLower() + " " + rawImage?.metadata?.Make + " " + rawImage?.metadata?.Model); #endif DefaultValue.Rotation = rawImage.metadata.OriginalRotation; DefaultValue.ReverseGamma = rawImage.IsGammaCorrected; DefaultValue.RMul = rawImage?.metadata.WbCoeffs?.Red ?? 1; DefaultValue.GMul = rawImage?.metadata.WbCoeffs?.Green ?? 1; DefaultValue.BMul = rawImage?.metadata.WbCoeffs?.Blue ?? 1; await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { var exif = rawImage.ParseExif(); //Group the data var groups = from x in exif group x by x.Group into grp orderby grp.Key select grp; //Set the grouped data to CollectionViewSource ExifSource.Source = groups; ResetControls(); UpdatePreview(true); ControlVisibilty.Value = true; SetImageSizeText(); }); if (rawImage.errors.Count > 0) { var loader = new Windows.ApplicationModel.Resources.ResourceLoader(); TextDisplay.DisplayWarning(loader.GetString("ErrorOnLoadWarning")); #if !DEBUG //send an event with file extension and camera model and make if any logger.Log("ErrorOnOpen " + file?.FileType.ToLower() + " " + rawImage?.metadata?.Make + " " + rawImage?.metadata?.Model + "" + rawImage.errors.Count); #endif } isBindingEnabled = true; thumbnail = null; } catch (Exception ex) { #if !DEBUG //send an event with file extension and camera model and make if any logger.Log("FailOpening " + file?.FileType.ToLower() + " " + rawImage?.metadata?.Make + " " + rawImage?.metadata?.Model); #endif await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { EmptyImage(); }); ImageSelected = false; var loader = new Windows.ApplicationModel.Resources.ResourceLoader(); TextDisplay.DisplayError(loader.GetString("ExceptionText")); } CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { // Blur(false); Load.Hide(); }); ImageSelected = false; }); }
private async void SaveButtonClickAsync(object sender, RoutedEventArgs e) { if (rawImage?.fullSize != null) { try { var savePicker = new FileSavePicker { SuggestedStartLocation = PickerLocationId.DocumentsLibrary, SuggestedFileName = rawImage.metadata.FileName }; foreach (KeyValuePair<string, List<string>> format in FormatHelper.SaveSupportedFormat) { savePicker.FileTypeChoices.Add(format.Key, format.Value); } StorageFile file = await savePicker.PickSaveFileAsync(); if (file == null) return; Load.Show(); //TODO //show an option Ui //when user click ok save the properties to a bitmapProperies //check isuser chose 16bits or not //save var task = Task.Run(() => { try { var watchPreview = Stopwatch.StartNew(); var result = ApplyImageEffect8bitsNoHistoAsync(rawImage.fullSize, EditionValue); watchPreview.Stop(); Debug.WriteLine("Apply done in " + watchPreview.ElapsedMilliseconds + " ms"); watchPreview = Stopwatch.StartNew(); //call GC here (GC does not empty automatically native object) GC.Collect(); FormatHelper.SaveAsync(file, result); watchPreview.Stop(); Debug.WriteLine("Save done in " + watchPreview.ElapsedMilliseconds + " ms"); } catch (Exception ex) { #if DEBUG TextDisplay.DisplayError(ex.Message); #else TextDisplay.DisplayError("An error occured while saving"); #endif } CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { //Blur(false); Load.Hide(); }); }); } catch (Exception ex) { #if DEBUG TextDisplay.DisplayError(ex.Message); #else TextDisplay.DisplayError("An error occured while saving"); #endif } } }
/// <summary> /// Appelé lorsque la navigation vers une page donnée échoue /// </summary> /// <param name="sender">Frame à l'origine de l'échec de navigation.</param> /// <param name="e">Détails relatifs à l'échec de navigation</param> void OnNavigationFailed(object sender, NavigationFailedEventArgs e) { var loader = new Windows.ApplicationModel.Resources.ResourceLoader(); TextDisplay.DisplayError(loader.GetString("LoadErrorMessage") + e.SourcePageType.FullName); }