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

Last change on this file since 12597 was 12597, checked in by Don-vip, 7 years ago

see #14794 - checkstyle/javadoc

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