Example #1
0
        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();
                    });
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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.
            }
        }
Example #4
0
        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
            }
        }