[josm-dev] Sharpen imagery layer

Sebastian Klein bastikln at googlemail.com
Mon Dec 6 09:57:43 GMT 2010


Stephan Knauss wrote:
> Hi,
> 
> as Potlatch2 provides the option to sharpen the image I thought this 
> should be possible in JOSM as well.
> 
> Unfortunately my 5 minute hack is not working. First I thought it might 
> be no BufferedImage, but it is one.
> 
> It throws an exception being unable to convolve the Image. It does not 
> tell why it's unable. Javadoc also does not tell.
> 
> As I'm no expert in this area I hope someone more experienced with 
> ConvolveOp can improve the imagery plugin.

Some sun bug reports suggest that you have to sanitize the image. This 
is a poor solution, but if the sharpened image is cached, it could be 
acceptable.

Index: src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java
===================================================================
--- src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java 
(revision 24571)
+++ src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java 
(working copy)
@@ -15,7 +15,11 @@
  import java.awt.event.MouseEvent;
  import java.awt.font.TextAttribute;
  import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.ConvolveOp;
  import java.awt.image.ImageObserver;
+import java.awt.image.Kernel;
  import java.io.IOException;
  import java.net.URI;
  import java.net.URISyntaxException;
@@ -685,10 +689,31 @@
          int img_x_end   = img_x_offset + (int)(target.getWidth() * 
imageXScaling);
          int img_y_end   = img_y_offset + (int)(target.getHeight() * 
imageYScaling);

+        boolean sharpen=true;
+        Image myImg;
+        if (sharpen && sourceImg instanceof BufferedImage) {
+            Kernel kernel = new Kernel(3, 3, new float[] { -1, -1, -1, 
-1, 9, -1, -1, -1, -1});
+            BufferedImageOp op = new ConvolveOp(kernel);
+
+            int w = sourceImg.getWidth(null);
+            int h = sourceImg.getHeight(null);
+            BufferedImage tmp = new BufferedImage(w, h, 
BufferedImage.TYPE_INT_RGB);
+
+            for (int i=0; i<w; i++) {
+                for (int j = 0; j < h; j++) {
+                    tmp.setRGB(i, j, 
((BufferedImage)sourceImg).getRGB(i, j));
+                }
+            }
+            myImg = op.filter(tmp, null);
+        } else {
+            myImg = sourceImg;
+            out("can not sharpen "+sourceImg.toString());
+        }
+
          if (debug) {
              out("drawing image into target rect: " + target);
          }
-        g.drawImage(sourceImg,
+        g.drawImage(myImg,
                          target.x, target.y,
                          target.x + target.width, target.y + target.height,
                          img_x_offset, img_y_offset,



> Sharpening could be an option in the context menu.
> 
> This is the patch to reproduce as well as the exception text.
> 
> 
> Index: src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java
> ===================================================================
> --- src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java 
> (revision 24542)
> +++ src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java 
> (working copy)
> @@ -15,7 +15,11 @@
>  import java.awt.event.MouseEvent;
>  import java.awt.font.TextAttribute;
>  import java.awt.geom.Rectangle2D;
> +import java.awt.image.BufferedImage;
> +import java.awt.image.BufferedImageOp;
> +import java.awt.image.ConvolveOp;
>  import java.awt.image.ImageObserver;
> +import java.awt.image.Kernel;
>  import java.io.IOException;
>  import java.net.URI;
>  import java.net.URISyntaxException;
> @@ -672,10 +676,21 @@
>          int img_x_end   = img_x_offset + (int)(target.getWidth() * 
> imageXScaling);
>          int img_y_end   = img_y_offset + (int)(target.getHeight() * 
> imageYScaling);
> 
> +        boolean sharpen=true;
> +        Image myImg;
> +        if (sharpen && sourceImg instanceof BufferedImage) {
> +            Kernel kernel = new Kernel(3, 3, new float[] { -1, -1, -1, 
> -1, 9, -1, -1, -1, -1});
> +            BufferedImageOp op = new ConvolveOp(kernel);
> +            myImg = op.filter((BufferedImage)sourceImg, null);
> +        } else {
> +            myImg = sourceImg;
> +            out("can not sharpen "+sourceImg.toString());
> +        }
> +
>          if (debug) {
>              out("drawing image into target rect: " + target);
>          }
> -        g.drawImage(sourceImg,
> +        g.drawImage(myImg,
>                          target.x, target.y,
>                          target.x + target.width, target.y + target.height,
>                          img_x_offset, img_y_offset,
> 
> 
> 
> java.awt.image.ImagingOpException: Unable to convolve src image
>         at java.awt.image.ConvolveOp.filter(Unknown Source)
>         at 
> org.openstreetmap.josm.plugins.imagery.tms.TMSLayer.drawImageInside(T
> MSLayer.java:684)
>         at 
> org.openstreetmap.josm.plugins.imagery.tms.TMSLayer.paintTileImages(T
> MSLayer.java:735)
>         at 
> org.openstreetmap.josm.plugins.imagery.tms.TMSLayer.paint(TMSLayer.ja
> va:993)
>         at org.openstreetmap.josm.gui.MapView.paint(MapView.java:516)
>         at javax.swing.JComponent.paintChildren(Unknown Source)
>         at javax.swing.JSplitPane.paintChildren(Unknown Source)
>         at javax.swing.JComponent.paint(Unknown Source)
>         at javax.swing.JComponent.paintChildren(Unknown Source)
>         at javax.swing.JComponent.paint(Unknown Source)
>         at javax.swing.JComponent.paintToOffscreen(Unknown Source)
>         at 
> javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown S
> ource)
>         at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
>         at javax.swing.RepaintManager.paint(Unknown Source)
>         at javax.swing.JComponent._paintImmediately(Unknown Source)
>         at javax.swing.JComponent.paintImmediately(Unknown Source)
>         at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
>         at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
>         at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
>         at 
> javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknow
> n Source)
>         at java.awt.event.InvocationEvent.dispatch(Unknown Source)
>         at java.awt.EventQueue.dispatchEvent(Unknown Source)
>         at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown 
> Source)
>         at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
>         at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown 
> Source)
>         at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
>         at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
>         at java.awt.EventDispatchThread.run(Unknown Source)
> 
> _______________________________________________
> josm-dev mailing list
> josm-dev at openstreetmap.org
> http://lists.openstreetmap.org/listinfo/josm-dev
> 




More information about the josm-dev mailing list