source: osm/applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/ImageModifier.java@ 13593

Last change on this file since 13593 was 13545, checked in by pieren, 17 years ago

Add municipality boundary import from SVG data delivered by cadastre WMS.

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1package cadastre_fr;
2
3import java.awt.Color;
4import java.awt.image.BufferedImage;
5import java.awt.image.ColorModel;
6import java.awt.image.IndexColorModel;
7import java.awt.image.WritableRaster;
8import org.openstreetmap.josm.Main;
9import org.openstreetmap.josm.tools.ColorHelper;
10
11public class ImageModifier {
12
13 /**
14 * Current background color used by cadastre.gouv.fr
15 */
16 private static final long serialVersionUID = 1L;
17
18 public static final int cadastreBackground = -1; // white
19
20 public BufferedImage bufferedImage;
21
22 private boolean withBackground = false;
23
24 private int backgroundPixel = 0;
25
26 private int backgroundSampleX, backgroundSampleY;
27
28 public ImageModifier(BufferedImage bi) {
29 bufferedImage = bi;
30 System.out.println("cadastrewms.alterColors="+Main.pref.getBoolean("cadastrewms.alterColors"));
31 System.out.println("cadastrewms.backgroundTransparent="+Main.pref.getBoolean("cadastrewms.backgroundTransparent"));
32 if (Main.pref.getBoolean("cadastrewms.alterColors")) {
33 changeColors();
34 if (Main.pref.getBoolean("cadastrewms.backgroundTransparent")) {
35 makeTransparent();
36 }
37 }
38 }
39
40 /**
41 * Replace the background color by the josm color.background color.
42 * @param bi
43 * @return
44 */
45 private void changeColors() {
46 int w = bufferedImage.getWidth();
47 int h = bufferedImage.getHeight();
48 int pixel;
49 int josmBackgroundColor = ColorHelper.html2color(Main.pref.get("color.background", "#FFFFFF")).getRGB();
50 boolean invertGrey = (Main.pref.getBoolean("cadastrewms.invertGrey"));
51 System.out.println("cadastrewms.invertGrey="+invertGrey);
52 System.out.println("color.background="+Main.pref.get("color.background", "#FFFFFF"));
53 for (int x = 0; x < w; x++) {
54 for (int y = 0; y < h; y++) {
55 pixel = bufferedImage.getRGB(x, y);
56 if (pixel == cadastreBackground) {
57 bufferedImage.setRGB(x, y, josmBackgroundColor);
58 if (!withBackground)
59 withBackground = true;
60 backgroundSampleX = x;
61 backgroundSampleY = y;
62 } else if (invertGrey) {
63 bufferedImage.setRGB(x, y, reverseIfGrey(pixel));
64 }
65 }
66 }
67 }
68
69 /**
70 * Reverse the grey value if the pixel is grey (light grey becomes dark grey)
71 * Used for texts.
72 * @param pixel
73 * @return
74 */
75 private int reverseIfGrey(int pixel) {
76 Color col = new Color(pixel);
77 int r = col.getRed();
78 int g = col.getGreen();
79 int b = col.getBlue();
80 if ((b == r) && (b == g)) {
81 pixel = (0x00 << 32) + ((byte) (255 - r) << 16) + ((byte) (255 - r) << 8) + ((byte) (255 - r));
82 }
83 return pixel;
84 }
85
86 private void makeTransparent() {
87 ColorModel colorModel = bufferedImage.getColorModel();
88 if (bufferedImage.getColorModel() instanceof IndexColorModel) {
89 // vector image (IndexColorModel)
90 IndexColorModel icm = (IndexColorModel) colorModel;
91 WritableRaster raster = bufferedImage.getRaster();
92 // pixel is offset in ICM's palette
93 if (withBackground)
94 backgroundPixel = raster.getSample(backgroundSampleX, backgroundSampleY, 0);
95 else
96 backgroundPixel = 1; // default Cadastre background sample
97 int size = icm.getMapSize();
98 byte[] reds = new byte[size];
99 byte[] greens = new byte[size];
100 byte[] blues = new byte[size];
101 icm.getReds(reds);
102 icm.getGreens(greens);
103 icm.getBlues(blues);
104 IndexColorModel icm2 = new IndexColorModel(colorModel.getPixelSize(), size, reds, greens, blues,
105 backgroundPixel);
106 bufferedImage = new BufferedImage(icm2, raster, bufferedImage.isAlphaPremultiplied(), null);
107 } else {
108 int width = bufferedImage.getWidth();
109 int height = bufferedImage.getHeight();
110 BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
111 for (int y = 0; y < height; y++) {
112 for (int x = 0; x < width; x++) {
113 Color c = new Color(bufferedImage.getRGB(x, y));
114 int r = c.getRed();
115 int g = c.getGreen();
116 int b = c.getBlue();
117 Color maskedColor;
118 if (r==0 && g==0 && b==0) {
119 maskedColor = new Color(r, g, b, 0x00);
120 } else {
121 maskedColor = new Color(r, g, b, 0xFF);
122 }
123 bi.setRGB(x, y, maskedColor.getRGB());
124 }
125 }
126 bufferedImage = bi;
127 }
128 return;
129 }
130}
Note: See TracBrowser for help on using the repository browser.