source: josm/trunk/src/org/openstreetmap/josm/gui/layer/imagery/SharpenImageProcessor.java @ 12594

Last change on this file since 12594 was 12594, checked in by bastiK, 6 weeks ago

fixed #15139 - raster-image filter settings are Not Stored when saving session (color Saturation, Brightness, Sharpness)

  • Property svn:eol-style set to native
File size: 3.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer.imagery;
3
4import java.awt.image.BufferedImage;
5import java.awt.image.ConvolveOp;
6import java.awt.image.Kernel;
7import java.util.Collections;
8import java.util.Map;
9
10import org.openstreetmap.josm.gui.layer.ImageProcessor;
11import org.openstreetmap.josm.io.session.SessionAwareReadApply;
12import org.openstreetmap.josm.tools.Utils;
13
14/**
15 * Sharpens or blurs the image, depending on the sharpen value.
16 * <p>
17 * A positive sharpen level means that we sharpen the image.
18 * <p>
19 * A negative sharpen level let's us blur the image. -1 is the most useful value there.
20 *
21 * @author Michael Zangl
22 * @since 10547
23 */
24public class SharpenImageProcessor implements ImageProcessor, SessionAwareReadApply {
25    private float sharpenLevel = 1.0f;
26    private ConvolveOp op;
27
28    private static final float[] KERNEL_IDENTITY = new float[] {
29        0, 0, 0,
30        0, 1, 0,
31        0, 0, 0
32    };
33
34    private static final float[] KERNEL_BLUR = new float[] {
35        1f / 16, 2f / 16, 1f / 16,
36        2f / 16, 4f / 16, 2f / 16,
37        1f / 16, 2f / 16, 1f / 16
38    };
39
40    private static final float[] KERNEL_SHARPEN = new float[] {
41        -.5f, -1f, -.5f,
42         -1f, 7, -1f,
43        -.5f, -1f, -.5f
44    };
45
46    /**
47     * Gets the current sharpen level.
48     * @return The level.
49     */
50    public float getSharpenLevel() {
51        return sharpenLevel;
52    }
53
54    /**
55     * Sets the sharpening level.
56     * @param sharpenLevel The level. Clamped to be positive or 0.
57     */
58    public void setSharpenLevel(float sharpenLevel) {
59        if (sharpenLevel < 0) {
60            this.sharpenLevel = 0;
61        } else {
62            this.sharpenLevel = sharpenLevel;
63        }
64
65        if (this.sharpenLevel < 0.95) {
66            op = generateMixed(this.sharpenLevel, KERNEL_IDENTITY, KERNEL_BLUR);
67        } else if (this.sharpenLevel > 1.05) {
68            op = generateMixed(this.sharpenLevel - 1, KERNEL_SHARPEN, KERNEL_IDENTITY);
69        } else {
70            op = null;
71        }
72    }
73
74    private static ConvolveOp generateMixed(float aFactor, float[] a, float[] b) {
75        if (a.length != 9 || b.length != 9) {
76            throw new IllegalArgumentException("Illegal kernel array length.");
77        }
78        float[] values = new float[9];
79        for (int i = 0; i < values.length; i++) {
80            values[i] = aFactor * a[i] + (1 - aFactor) * b[i];
81        }
82        return new ConvolveOp(new Kernel(3, 3, values), ConvolveOp.EDGE_NO_OP, null);
83    }
84
85    @Override
86    public BufferedImage process(BufferedImage image) {
87        if (op != null) {
88            return op.filter(image, null);
89        } else {
90            return image;
91        }
92    }
93
94    @Override
95    public void applyFromPropertiesMap(Map<String, String> properties) {
96        String vStr = properties.get("sharpenlevel");
97        if (vStr != null) {
98            try {
99                setSharpenLevel(Float.parseFloat(vStr));
100            } catch (NumberFormatException e) {
101                // nothing
102            }
103        }
104    }
105
106    @Override
107    public Map<String, String> toPropertiesMap() {
108        if (Utils.equalsEpsilon(sharpenLevel, 1.0))
109            return Collections.emptyMap();
110        else
111            return Collections.singletonMap("sharpenlevel", Float.toString(sharpenLevel));
112    }
113
114    @Override
115    public String toString() {
116        return "SharpenImageProcessor [sharpenLevel=" + sharpenLevel + ']';
117    }
118}
Note: See TracBrowser for help on using the repository browser.