Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 18299)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 18300)
@@ -14,4 +14,5 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.WindowEvent;
+import java.io.IOException;
 import java.io.Serializable;
 import java.time.ZoneOffset;
@@ -58,4 +59,5 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
+import org.openstreetmap.josm.tools.PlatformManager;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.date.DateUtils;
@@ -80,4 +82,5 @@
     private final ImageLastAction imageLastAction = new ImageLastAction();
     private final ImageCopyPathAction imageCopyPathAction = new ImageCopyPathAction();
+    private final ImageOpenExternalAction imageOpenExternalAction = new ImageOpenExternalAction();
     private final LayerVisibilityAction visibilityAction = new LayerVisibilityAction(Collections::emptyList,
             () -> Collections.singleton(imageryFilterSettings));
@@ -115,4 +118,5 @@
     private JButton btnDelete;
     private JButton btnCopyPath;
+    private JButton btnOpenExternal;
     private JButton btnDeleteFromDisk;
     private JToggleButton tbCentre;
@@ -160,4 +164,5 @@
         btnDeleteFromDisk = createButton(imageRemoveFromDiskAction, buttonDim);
         btnCopyPath = createButton(imageCopyPathAction, buttonDim);
+        btnOpenExternal = createButton(imageOpenExternalAction, buttonDim);
 
         btnNext = createNavigationButton(imageNextAction, buttonDim);
@@ -186,4 +191,5 @@
         buttons.add(Box.createRigidArea(new Dimension(7, 0)));
         buttons.add(btnCopyPath);
+        buttons.add(btnOpenExternal);
         buttons.add(Box.createRigidArea(new Dimension(7, 0)));
         buttons.add(createButton(visibilityAction, buttonDim));
@@ -220,4 +226,5 @@
         imageCollapseAction.destroy();
         imageCopyPathAction.destroy();
+        imageOpenExternalAction.destroy();
         imageRemoveAction.destroy();
         imageRemoveFromDiskAction.destroy();
@@ -230,4 +237,5 @@
     /**
      * This literally exists to silence sonarlint complaints.
+     * @param <I> the type of the operand and result of the operator
      */
     @FunctionalInterface
@@ -494,4 +502,21 @@
     }
 
+    private class ImageOpenExternalAction extends JosmAction {
+        ImageOpenExternalAction() {
+            super(null, new ImageProvider("external-link"), tr("Open image in external viewer"), null, false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (currentEntry != null) {
+                try {
+                    PlatformManager.getPlatform().openUrl(currentEntry.getFile().toURI().toURL().toExternalForm());
+                } catch (IOException ex) {
+                    Logging.error(ex);
+                }
+            }
+        }
+    }
+
     /**
      * Enables (or disables) the "Previous" button.
@@ -605,4 +630,5 @@
         btnDeleteFromDisk.setEnabled(hasMultipleImages);
         btnCopyPath.setEnabled(false);
+        btnOpenExternal.setEnabled(false);
         if (hasMultipleImages) {
             imgDisplay.setEmptyText(tr("Multiple images selected"));
@@ -633,4 +659,5 @@
         btnDeleteFromDisk.setEnabled(entry.isDeleteSupported() && entry.isRemoveSupported());
         btnCopyPath.setEnabled(true);
+        btnOpenExternal.setEnabled(true);
 
         setTitle(tr("Geotagged Images") + (!entry.getDisplayName().isEmpty() ? " - " + entry.getDisplayName() : ""));
