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

Last change on this file since 17089 was 17089, checked in by pieren, 15 years ago

raster image feature implementation

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