public void GeotagingFailure() { var task = WaitLocation(); task.Wait(); var position = task.Result; Debug.WriteLine("pos: " + position.Coordinate.Longitude + " " + position.Coordinate.Latitude); var mediaLibrary = new MediaLibrary(); foreach (string filename in TestFiles.GeotagImages) { var image = TestUtil.GetResourceByteArray(filename); Assert.ThrowsException <GpsInformationAlreadyExistsException>(() => { var NewImage = MetaDataOperator.AddGeoposition(image, position); }); GC.Collect(); using (var imageStream = TestUtil.GetResourceStream(filename)) { Assert.ThrowsException <GpsInformationAlreadyExistsException>(() => { var newImageStream = MetaDataOperator.AddGeoposition(imageStream, position); newImageStream.Close(); }); } } }
public static async Task <GeotaggingResult> AddGeotag(Stream image, Geoposition location) { var result = new GeotaggingResult() { OperationResult = GeotaggingResult.Result.OK, Image = image, }; // From UWP, a stream from HttpResponseMessage doesn't support seeking. if (!image.CanSeek) { var original = image; var seekable = new MemoryStream(); image.CopyTo(seekable); seekable.Seek(0, SeekOrigin.Begin); image = seekable; original.Dispose(); } try { result.Image = await MetaDataOperator.AddGeopositionAsync(image, location, false); } catch (GpsInformationAlreadyExistsException) { result.OperationResult = GeotaggingResult.Result.GeotagAlreadyExists; } catch { result.OperationResult = GeotaggingResult.Result.UnExpectedError; } return(result); }
public void OverwriteGeotag() { var task = WaitLocation(); task.Wait(); var position = task.Result; Debug.WriteLine("pos: " + position.Coordinate.Longitude + " " + position.Coordinate.Latitude); var mediaLibrary = new MediaLibrary(); int count = 0; foreach (string filename in TestFiles.ValidImages) { var image = TestUtil.GetResourceByteArray(filename); var originalMetadata = JpegMetaDataParser.ParseImage(image); var NewImage = MetaDataOperator.AddGeoposition(image, position, true); var newMetadata = JpegMetaDataParser.ParseImage(NewImage); try { var pic = mediaLibrary.SavePicture(string.Format("Exif addition test_" + count + "_{0:yyyyMMdd_HHmmss}.jpg", DateTime.Now), NewImage); } catch (NullReferenceException) { } GC.Collect(); TestUtil.IsGpsDataAdded(originalMetadata, newMetadata); using (var imageStream = TestUtil.GetResourceStream(filename)) { originalMetadata = JpegMetaDataParser.ParseImage(imageStream); var newImageStream = MetaDataOperator.AddGeoposition(imageStream, position, true); try { var pic2 = mediaLibrary.SavePicture(string.Format("Exif addition test_" + count + "_stream_{0:yyyyMMdd_HHmmss}.jpg", DateTime.Now), newImageStream); } catch (NullReferenceException) { } finally { newImageStream.Dispose(); } TestUtil.IsGpsDataAdded(originalMetadata, newMetadata); count++; } GC.Collect(); // Saving many big images in short time, memory mey be run out and it may throws NullReferenceException or OutOfMemoryException. } }
private async Task DownloadToSave(DownloadRequest req) { DebugUtil.Log("Download picture: " + req.Uri.OriginalString); try { var geoResult = GeotaggingResult.NotRequested; var res = await HttpClient.GetAsync(req.Uri, HttpCompletionOption.ResponseContentRead).ConfigureAwait(false); switch (res.StatusCode) { case HttpStatusCode.OK: break; case HttpStatusCode.Gone: req.Error.Raise(DownloaderError.Gone, geoResult); return; default: req.Error.Raise(DownloaderError.Network, geoResult); return; } var imageStream = await res.Content.ReadAsStreamAsync().ConfigureAwait(false); if (req.Mediatype == Mediatype.Image && req.GeoPosition != null) { try { imageStream = await MetaDataOperator.AddGeopositionAsync(imageStream, req.GeoPosition, false); geoResult = Utility.GeotaggingResult.OK; } catch (GpsInformationAlreadyExistsException) { geoResult = GeotaggingResult.GeotagAlreadyExists; } catch { geoResult = GeotaggingResult.UnExpectedError; } } using (imageStream) { StorageFolder rootFolder; switch (req.Mediatype) { case Mediatype.Image: rootFolder = KnownFolders.PicturesLibrary; break; case Mediatype.Video: rootFolder = KnownFolders.PicturesLibrary; // Use Pictures folder according to the behavior of built-in Camera apps // rootFolder = KnownFolders.VideosLibrary; break; default: return; } var folder = await rootFolder.CreateFolderAsync(DIRECTORY_NAME, CreationCollisionOption.OpenIfExists); var filename = string.Format(req.NameBase + "_{0:yyyyMMdd_HHmmss}" + req.extension, DateTime.Now); var file = await folder.CreateFileAsync(filename, CreationCollisionOption.GenerateUniqueName); using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite)) { var buffer = new byte[BUFFER_SIZE]; using (var os = stream.GetOutputStreamAt(0)) { int read = 0; while ((read = imageStream.Read(buffer, 0, BUFFER_SIZE)) != 0) { await os.WriteAsync(buffer.AsBuffer(0, read)); } } } req.Completed.Raise(folder, file, geoResult); return; } } catch (Exception e) { DebugUtil.Log(e.Message); DebugUtil.Log(e.StackTrace); req.Error.Raise(DownloaderError.Unknown, GeotaggingResult.NotRequested); // TODO } }