private void bgwShowImage_DoWork(object sender, DoWorkEventArgs e) { PointLatLng pos = gMap.Position; int progress = 0; OverlayPhotosWGS.Markers.Clear(); OverlayPhotosMAR.Markers.Clear(); foreach (KeyValuePair <Image, string> img in photos) { using (Image photo = new Bitmap(img.Value)) { pos.Lat = EXIF.GetLatitude(photo); pos.Lng = EXIF.GetLongitude(photo); photo.Dispose(); } if (double.IsNaN(pos.Lat) || double.IsNaN(pos.Lng)) { continue; } double lat = pos.Lat, lng = pos.Lng; PosShift.Convert2Mars(pos.Lng, pos.Lat, out lng, out lat); GMarkerGoogle marker_wgs = new GMarkerGoogle(pos, GMarkerGoogleType.green_dot); GMapImageToolTip tooltip_wgs = new GMapImageToolTip(marker_wgs); tooltip_wgs.Image = img.Key; tooltip_wgs.Offset = new Point(0, -12); tooltip_wgs.Font = new Font("Segoe UI", 8); tooltip_wgs.Stroke = new System.Drawing.Pen(System.Drawing.Color.LightCoral, 2); tooltip_wgs.Fill = new SolidBrush(System.Drawing.Color.Snow); marker_wgs.ToolTip = tooltip_wgs; marker_wgs.ToolTipText = Path.GetFileName(img.Value); marker_wgs.Tag = pos; OverlayPhotosWGS.Markers.Add(marker_wgs); GMarkerGoogle marker_mar = new GMarkerGoogle(new PointLatLng(lat, lng), GMarkerGoogleType.green_dot); GMapImageToolTip tooltip_mar = new GMapImageToolTip(marker_mar); tooltip_mar.Image = img.Key; tooltip_mar.Offset = new Point(0, -12); tooltip_mar.Font = new Font("Segoe UI", 8); tooltip_mar.Stroke = new System.Drawing.Pen(System.Drawing.Color.SlateBlue, 2); tooltip_mar.Fill = new SolidBrush(System.Drawing.Color.Snow); marker_mar.ToolTip = tooltip_mar; marker_mar.ToolTipText = Path.GetFileName(img.Value); marker_mar.Tag = new PointLatLng(lat, lng); OverlayPhotosMAR.Markers.Add(marker_mar); progress++; if (bgwShowImage.IsBusy) { bgwShowImage.ReportProgress(progress); } } }
private void gMap_MouseUp(object sender, MouseEventArgs e) { mouse_down = false; if (currentMarker != null) { if (bgwSetGeo.IsBusy) { return; } if (MessageBox.Show(this, "Place photo(s) to here?", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { //PointLatLng pos = gMap.FromLocalToLatLng( e.X, e.Y ); //GMapImageToolTip currentTooltip = (GMapImageToolTip)(currentMarker.ToolTip); //currentMarker.Tag = pos; //KeyValuePair<PointLatLng, GMapImageToolTip> param = new KeyValuePair<PointLatLng, GMapImageToolTip>(pos, currentTooltip); //bgwSetGeo.RunWorkerAsync( param ); //currentMarker.Tag = new PointLatLng( e.X, e.Y ); currentMarker.Tag = currentMarker.Position; if (pinMarker != null) { pinMarker.Tag = currentMarker.Position; PointLatLng pos = gMap.FromLocalToLatLng(e.X, e.Y); //SetImageGeoTag( pos ); //tsProgress.Visible = true; tsProgress.Minimum = 0; tsProgress.Maximum = photos.Count; bgwSetGeo.RunWorkerAsync(pos); } else { GMapImageToolTip currentTooltip = (GMapImageToolTip)(currentMarker.ToolTip); foreach (KeyValuePair <Image, string> kp in photos) { if (kp.Key == currentTooltip.Image) { string currentFile = kp.Value; SetImageGeoTag(gMap.FromLocalToLatLng(e.X, e.Y), currentFile); break; } } } //currentMarker = null; //pinMarker = null; } } currentMarker = null; }
public void SetImageGeoTag(PointLatLng pos) { //PointLatLng pos = gMap.Position; //return; OverlayPhotosWGS.Markers.Clear(); OverlayPhotosMAR.Markers.Clear(); foreach (KeyValuePair <Image, string> img in photos) { #region calc position double lat = pos.Lat, lng = pos.Lng; double lat_mar = lat, lng_mar = lng; double lat_wgs = lat, lng_wgs = lng; if (chkMapShift.Checked) { PosShift.Convert2WGS(pos.Lng, pos.Lat, out lng, out lat); lat_wgs = lat; lng_wgs = lng; } else { PosShift.Convert2Mars(pos.Lng, pos.Lat, out lng, out lat); lat_mar = lat; lng_mar = lng; } #endregion #region touch photo //Image photo = new Bitmap(img.Value); using (FileStream fs = new FileStream(img.Value, FileMode.Open, FileAccess.Read)) { Image photo = Image.FromStream(fs, true, true); photo = EXIF.Geotag(photo, lat_wgs, lng_wgs); fs.Close(); ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality; EncoderParameters myEncoderParameters = new EncoderParameters(1); EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 92L); myEncoderParameters.Param[0] = myEncoderParameter; photo.Save(img.Value, jpgEncoder, myEncoderParameters); photo.Dispose(); } Dictionary <string, string> properties = (Dictionary <string, string>)img.Key.Tag; if (properties != null) { FileInfo fi = new FileInfo(img.Value); DateTime dt = DateTime.Now; if (!string.IsNullOrEmpty(properties["DateTaken"])) { dt = DateTime.Parse(properties["DateTaken"]); } else if (!string.IsNullOrEmpty(properties["DateCreated"])) { dt = DateTime.Parse(properties["DateCreated"]); } else if (!string.IsNullOrEmpty(properties["DateModified"])) { dt = DateTime.Parse(properties["DateModified"]); } else if (!string.IsNullOrEmpty(properties["DateAccessed"])) { dt = DateTime.Parse(properties["DateAccessed"]); } fi.LastAccessTimeUtc = dt.ToUniversalTime(); fi.LastWriteTimeUtc = dt.ToUniversalTime(); fi.CreationTimeUtc = dt.ToUniversalTime(); } #endregion #region create new marker for moved marker GMarkerGoogle marker_wgs = new GMarkerGoogle(new PointLatLng(lat_wgs, lng_wgs), GMarkerGoogleType.orange_dot); GMapImageToolTip tooltip_wgs = new GMapImageToolTip(marker_wgs); tooltip_wgs.Image = img.Key; tooltip_wgs.Offset = new Point(0, -12); tooltip_wgs.Font = new Font("Segoe UI", 8); tooltip_wgs.Stroke = new System.Drawing.Pen(System.Drawing.Color.SlateBlue, 2); tooltip_wgs.Fill = new SolidBrush(System.Drawing.Color.Snow); marker_wgs.ToolTip = tooltip_wgs; marker_wgs.ToolTipText = Path.GetFileName(img.Value); marker_wgs.Tag = new PointLatLng(lat_wgs, lng_wgs); OverlayPhotosWGS.Markers.Add(marker_wgs); GMarkerGoogle marker_mar = new GMarkerGoogle(new PointLatLng(lat_mar, lng_mar), GMarkerGoogleType.orange_dot); GMapImageToolTip tooltip_mar = new GMapImageToolTip(marker_mar); tooltip_mar.Image = img.Key; tooltip_mar.Offset = new Point(0, -12); tooltip_mar.Font = new Font("Segoe UI", 8); tooltip_mar.Stroke = new System.Drawing.Pen(System.Drawing.Color.SlateBlue, 2); tooltip_mar.Fill = new SolidBrush(System.Drawing.Color.Snow); marker_mar.ToolTip = tooltip_mar; marker_mar.ToolTipText = Path.GetFileName(img.Value); marker_mar.Tag = new PointLatLng(lat_mar, lng_mar); OverlayPhotosMAR.Markers.Add(marker_mar); #endregion if (bgwSetGeo.IsBusy) { bgwSetGeo.ReportProgress(OverlayPhotosMAR.Markers.Count); } } if (OverlayRefPos.Markers.Count > 0) { OverlayRefPos.Markers.RemoveAt(OverlayRefPos.Markers.Count - 1); } updatePositions(OverlayPhotos, true); }
public void SetImageGeoTag(PointLatLng pos, string image) { #region calc position for wgs & mars double lat = pos.Lat, lng = pos.Lng; double lat_mar = lat, lng_mar = lng; double lat_wgs = lat, lng_wgs = lng; if (chkMapShift.Checked) { PosShift.Convert2WGS(pos.Lng, pos.Lat, out lng, out lat); lat_wgs = lat; lng_wgs = lng; } else { PosShift.Convert2Mars(pos.Lng, pos.Lat, out lng, out lat); lat_mar = lat; lng_mar = lng; } #endregion #region update modified marker position GMapImageToolTip currentTooltip = (GMapImageToolTip)(currentMarker.ToolTip); foreach (GMarkerGoogle marker in OverlayPhotosWGS.Markers) { GMapImageToolTip markerTooltip = (GMapImageToolTip)(marker.ToolTip); if (markerTooltip.Image == currentTooltip.Image) { marker.Position = new PointLatLng(lat_wgs, lng_wgs); break; } } foreach (GMarkerGoogle marker in OverlayPhotosMAR.Markers) { GMapImageToolTip markerTooltip = (GMapImageToolTip)(marker.ToolTip); if (markerTooltip.Image == currentTooltip.Image) { marker.Position = new PointLatLng(lat_mar, lng_mar); break; } } #endregion #region Touch file datetime to DateTaken/DateOriginal FileInfo fi = new FileInfo(image); DateTime dt = DateTime.Now; using (FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read)) { Image photo = Image.FromStream(fs, true, true); photo = EXIF.Geotag(photo, lat_wgs, lng_wgs); fs.Close(); try { if (photo.PropertyIdList.Contains(EXIF.PropertyTagExifDTOrig)) { PropertyItem DTOrig = photo.GetPropertyItem(EXIF.PropertyTagExifDTOrig); ASCIIEncoding enc = new ASCIIEncoding(); string dateTakenText = enc.GetString(DTOrig.Value, 0, DTOrig.Len - 1); if (!string.IsNullOrEmpty(dateTakenText)) { if (!DateTime.TryParseExact(dateTakenText, "yyyy:MM:dd HH:mm:ss", CultureInfo.CurrentCulture, DateTimeStyles.None, out dt)) { } } } } catch { } ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality; EncoderParameters myEncoderParameters = new EncoderParameters(1); EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 92L); myEncoderParameters.Param[0] = myEncoderParameter; photo.Save(image, jpgEncoder, myEncoderParameters); photo.Dispose(); } fi.LastAccessTimeUtc = dt.ToUniversalTime(); fi.LastWriteTimeUtc = dt.ToUniversalTime(); fi.CreationTimeUtc = dt.ToUniversalTime(); #endregion #region using media.image modify geotag #endregion }