private void PositionImage(ExifImage image, int index) { double delta = index - mCurrent; double deltaAbs = System.Math.Abs(delta); //double maxDrawSize = IMAGE_SIZE_FACTOR * ImageCanvas.ActualHeight; double maxDrawSize = MAX_IMAGE_SIZE; // scale image ScaleTransform scale = new ScaleTransform(); double ratio = 0.0; if (image.PixelWidth >= image.PixelHeight) { // w > h, fit width to draw size ratio = maxDrawSize / image.PixelWidth; } else { // fit height to draw size ratio = maxDrawSize / image.PixelHeight; } scale.ScaleY = ratio * (1.0 - (deltaAbs * SCALE_DOWN_FACTOR)); scale.ScaleX = ratio * (1.0 - (deltaAbs * SCALE_DOWN_FACTOR)); // set the transform image.Image.RenderTransform = scale; // position the image double left = mCanvasCenterX - (image.PixelWidth * scale.ScaleX * 0.5) + delta * OFFSET_FACTOR; image.Image.SetValue(Canvas.LeftProperty, left); double top = mCanvasCenterY - (image.PixelHeight * scale.ScaleY * 0.5) + 95; image.Image.SetValue(Canvas.TopProperty, top); // set alpha image.Image.Opacity = 1.0 - (deltaAbs * OPACITY_DOWN_FACTOR); // z-index image.Image.SetValue(Canvas.ZIndexProperty, (int)(maxDrawSize * (1.0 - (deltaAbs * SCALE_DOWN_FACTOR)))); }
private void UpdateImageInfo() { ExifImage i = mImages[(int)mTarget]; StringBuilder sb = new StringBuilder(256); sb.AppendLine(i.ImageInfo.FileName + " (" + (i.ImageInfo.FileSize / (1 << 10)) + "KB" + ")"); sb.AppendLine("Load time: " + i.ImageInfo.LoadTime.TotalMilliseconds + "ms"); if (i.ImageInfo.IsValid) { sb.AppendLine("Date taken: " + i.ImageInfo.DateTime); if (!string.IsNullOrEmpty(i.ImageInfo.Make)) { sb.AppendLine("Make: " + i.ImageInfo.Make); sb.AppendLine("Model: " + i.ImageInfo.Model); } sb.AppendLine("Dimensions: " + i.ImageInfo.Width + "x" + i.ImageInfo.Height); if (i.ImageInfo.ExposureTime > 0.0) { sb.AppendLine("Exposure: " + i.ImageInfo.ExposureTime + " seconds"); sb.AppendLine("Flash: " + i.ImageInfo.Flash.ToString()); } sb.AppendLine("Thumbnail: " + ((i.ImageInfo.ThumbnailData == null) ? "No" : "Yes")); if (i.ImageInfo.GpsLatitudeRef != ExifGpsLatitudeRef.Unknown) { // format GPS info as a Google Maps URL double latitude = i.ImageInfo.GpsLatitude[0] + i.ImageInfo.GpsLatitude[1] / 60.0 + i.ImageInfo.GpsLatitude[2] / 3600.0; if (i.ImageInfo.GpsLatitudeRef == ExifGpsLatitudeRef.South) { latitude = -latitude; } double longitude = i.ImageInfo.GpsLongitude[0] + i.ImageInfo.GpsLongitude[1] / 60.0 + i.ImageInfo.GpsLongitude[2] / 3600.0; if (i.ImageInfo.GpsLongitudeRef == ExifGpsLongitudeRef.West) { longitude = -longitude; } sb.AppendLine("http://www.bing.com/maps/?v=2&cp=" + latitude + "~" + longitude + "&lvl=16&sty=r"); sb.AppendLine("http://maps.google.com/maps?q=" + latitude + "," + longitude); } } else { sb.AppendLine("Unrecognized format"); } this.ImageInfoText.Text = sb.ToString(); }
private void AddImage(FileInfo fi) { try { DateTime then = DateTime.Now; JpegInfo info = ExifReader.ReadJpeg(fi); BitmapImage img = new BitmapImage(); if (info.ThumbnailData != null) { // the fast way - using the Exif thumbnail for preview MemoryStream ms = new MemoryStream(info.ThumbnailData); img.SetSource(ms); } else { // the slow and expensive way - loading a monster image in memory img.CreateOptions = BitmapCreateOptions.None; using (FileStream fs = fi.OpenRead()) { img.SetSource(fs); fs.Close(); } } info.LoadTime = (DateTime.Now - then); ExifImage image = new ExifImage(img, info); ImageCanvas.Children.Add(image.Image); int oldCount = mImages.Count; mImages.Add(image); if (oldCount == 0) { UpdateImageInfo(); } } catch (OutOfMemoryException) { HtmlPage.Window.Alert("You are out of memory. No more images will be loaded."); throw; } catch (Exception e) { // well that sucks. HtmlPage.Window.Alert("An error occured:\r\n" + e.ToString()); } // this could be expensive, try to clean up as we go... GC.Collect(); }
private void AddImage(FileInfo fi) { try { DateTime then = DateTime.Now; JpegInfo info = ExifReader.ReadJpeg(fi); BitmapImage img = new BitmapImage(); if (info.ThumbnailData != null) { // the fast way - using the Exif thumbnail for preview MemoryStream ms = new MemoryStream(info.ThumbnailData); img.SetSource(ms); } else { // the slow and expensive way - loading a monster image in memory img.CreateOptions = BitmapCreateOptions.None; using (FileStream fs = fi.OpenRead()) { img.SetSource(fs); fs.Close(); } } info.LoadTime = (DateTime.Now - then); ExifImage image = new ExifImage(img, info); ImageCanvas.Children.Add(image.Image); int oldCount = mImages.Count; mImages.Add(image); if (oldCount == 0) UpdateImageInfo(); } catch (OutOfMemoryException) { HtmlPage.Window.Alert("You are out of memory. No more images will be loaded."); throw; } catch (Exception e) { // well that sucks. HtmlPage.Window.Alert("An error occured:\r\n" + e.ToString()); } // this could be expensive, try to clean up as we go... GC.Collect(); }