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

Last change on this file since 15904 was 13784, checked in by pieren, 16 years ago

Fix minor bugs, add the fixed size grab scale configurable, fix pbls in transparency.

  • 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 static final int cadastreBackgroundTransp = 1; // original white but transparent
21
22 public BufferedImage bufferedImage;
23
24 private boolean withBackground = false;
25
26 private int backgroundPixel = 0;
27
28 private int backgroundSampleX, backgroundSampleY;
29
30 public ImageModifier(BufferedImage bi) {
31 bufferedImage = bi;
32 if (Main.pref.getBoolean("cadastrewms.backgroundTransparent"))
33 makeTransparent();
34 else if (Main.pref.getBoolean("cadastrewms.alterColors"))
35 replaceBackground();
36
37 if (Main.pref.getBoolean("cadastrewms.invertGrey"))
38 invertGrey();
39 }
40
41 /**
42 * Replace the background color by the josm color.background color.
43 */
44 private void replaceBackground() {
45 int w = bufferedImage.getWidth();
46 int h = bufferedImage.getHeight();
47 int josmBackgroundColor = ColorHelper.html2color(Main.pref.get("color.background", "#000000")).getRGB();
48 for (int x = 0; x < w; x++) {
49 for (int y = 0; y < h; y++) {
50 int pixel = bufferedImage.getRGB(x, y);
51 if (pixel == cadastreBackground) {
52 bufferedImage.setRGB(x, y, josmBackgroundColor);
53 if (!withBackground)
54 withBackground = true;
55 backgroundSampleX = x;
56 backgroundSampleY = y;
57 }
58 }
59 }
60 }
61
62 /**
63 * Invert black/white/grey pixels (to change original black characters to white).
64 */
65 private void invertGrey() {
66 int w = bufferedImage.getWidth();
67 int h = bufferedImage.getHeight();
68 for (int x = 0; x < w; x++) {
69 for (int y = 0; y < h; y++) {
70 int pixel = bufferedImage.getRGB(x, y);
71 if (pixel != cadastreBackground) {
72 bufferedImage.setRGB(x, y, reverseIfGrey(pixel));
73 }
74 }
75 }
76 }
77
78 /**
79 * Reverse the grey value if the pixel is grey (light grey becomes dark grey)
80 * Used for texts.
81 * @param pixel
82 * @return
83 */
84 private int reverseIfGrey(int pixel) {
85 Color col = new Color(pixel);
86 int r = col.getRed();
87 int g = col.getGreen();
88 int b = col.getBlue();
89 if ((b == r) && (b == g)) {
90 pixel = (0x00 << 32) + ((byte) (255 - r) << 16) + ((byte) (255 - r) << 8) + ((byte) (255 - r));
91 }
92 return pixel;
93 }
94
95 private void makeTransparent() {
96 ColorModel colorModel = bufferedImage.getColorModel();
97 if (bufferedImage.getColorModel() instanceof IndexColorModel) {
98 // vector image (IndexColorModel)
99 IndexColorModel icm = (IndexColorModel) colorModel;
100 WritableRaster raster = bufferedImage.getRaster();
101 // pixel is offset in ICM's palette
102 if (withBackground)
103 backgroundPixel = raster.getSample(backgroundSampleX, backgroundSampleY, 0);
104 else
105 backgroundPixel = 1; // default Cadastre background sample
106 int size = icm.getMapSize();
107 byte[] reds = new byte[size];
108 byte[] greens = new byte[size];
109 byte[] blues = new byte[size];
110 icm.getReds(reds);
111 icm.getGreens(greens);
112 icm.getBlues(blues);
113 IndexColorModel icm2 = new IndexColorModel(colorModel.getPixelSize(), size, reds, greens, blues,
114 backgroundPixel);
115 bufferedImage = new BufferedImage(icm2, raster, bufferedImage.isAlphaPremultiplied(), null);
116 } else {
117 int width = bufferedImage.getWidth();
118 int height = bufferedImage.getHeight();
119 BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
120 for (int y = 0; y < height; y++) {
121 for (int x = 0; x < width; x++) {
122 Color c = new Color(bufferedImage.getRGB(x, y));
123 int r = c.getRed();
124 int g = c.getGreen();
125 int b = c.getBlue();
126 Color maskedColor;
127 if (r==0 && g==0 && b==0) {
128 maskedColor = new Color(r, g, b, 0x00);
129 } else {
130 maskedColor = new Color(r, g, b, 0xFF);
131 }
132 bi.setRGB(x, y, maskedColor.getRGB());
133 }
134 }
135 bufferedImage = bi;
136 }
137 return;
138 }
139}
Note: See TracBrowser for help on using the repository browser.