gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / viewexport / Export.java @ 3749
History | View | Annotate | Download (10.8 KB)
1 | 2480 | nbrodin | package org.gvsig.raster.tools.app.basic.tool.viewexport; |
---|---|---|---|
2 | |||
3 | import java.awt.Component; |
||
4 | import java.awt.geom.AffineTransform; |
||
5 | import java.awt.image.BufferedImage; |
||
6 | import java.io.File; |
||
7 | import java.io.IOException; |
||
8 | import java.util.Hashtable; |
||
9 | import java.util.Iterator; |
||
10 | |||
11 | import javax.swing.JFileChooser; |
||
12 | import javax.swing.JOptionPane; |
||
13 | import javax.swing.filechooser.FileFilter; |
||
14 | |||
15 | import org.gvsig.andami.PluginServices; |
||
16 | import org.gvsig.andami.plugins.Extension; |
||
17 | import org.gvsig.andami.ui.mdiManager.IWindow; |
||
18 | import org.gvsig.app.project.documents.view.gui.AbstractViewPanel; |
||
19 | import org.gvsig.fmap.dal.coverage.RasterLocator; |
||
20 | import org.gvsig.fmap.dal.coverage.RasterManager; |
||
21 | import org.gvsig.fmap.dal.coverage.dataset.Buffer; |
||
22 | import org.gvsig.fmap.dal.coverage.datastruct.Params; |
||
23 | import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException; |
||
24 | import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException; |
||
25 | import org.gvsig.fmap.dal.coverage.exception.RasterDriverException; |
||
26 | import org.gvsig.fmap.dal.coverage.store.DataServerWriter; |
||
27 | import org.gvsig.fmap.dal.coverage.store.RasterWriter; |
||
28 | import org.gvsig.fmap.mapcontext.layers.FLayers; |
||
29 | import org.slf4j.Logger; |
||
30 | import org.slf4j.LoggerFactory; |
||
31 | |||
32 | import com.sun.jimi.core.Jimi; |
||
33 | import com.sun.jimi.core.JimiException; |
||
34 | |||
35 | |||
36 | /**
|
||
37 | * Plugin to export the view to image
|
||
38 | */
|
||
39 | public class Export extends Extension { |
||
40 | private Logger log = LoggerFactory.getLogger(Export.class); |
||
41 | private String lastPath = null; |
||
42 | private Hashtable<String, MyFileFilter> cmsExtensionsSupported = null; |
||
43 | private Hashtable<String, MyFileFilter> jimiExtensionsSupported = null; |
||
44 | |||
45 | public boolean isEnabled() { |
||
46 | IWindow f = PluginServices.getMDIManager().getActiveWindow(); |
||
47 | |||
48 | if (f == null || !(f instanceof AbstractViewPanel)) { |
||
49 | return false; |
||
50 | } |
||
51 | |||
52 | AbstractViewPanel avp = (AbstractViewPanel)f; |
||
53 | FLayers layers = avp.getMapControl().getMapContext().getLayers(); |
||
54 | for (int i = 0; i < layers.getLayersCount(); i++) { |
||
55 | if(layers.getLayer(i) != null) |
||
56 | return layers.getLayer(i).isAvailable();
|
||
57 | } |
||
58 | return false; |
||
59 | } |
||
60 | |||
61 | public boolean isVisible() { |
||
62 | IWindow f = PluginServices.getMDIManager().getActiveWindow(); |
||
63 | if (f == null) { |
||
64 | return false; |
||
65 | } |
||
66 | |||
67 | return (f instanceof AbstractViewPanel); |
||
68 | } |
||
69 | |||
70 | public void initialize() { |
||
71 | } |
||
72 | |||
73 | public void postInitialize() { |
||
74 | cmsExtensionsSupported = new Hashtable<String, MyFileFilter>(); |
||
75 | jimiExtensionsSupported = new Hashtable<String, MyFileFilter>(); |
||
76 | cmsExtensionsSupported.put("jpg", new MyFileFilter("jpg", |
||
77 | 3749 | mcompany | PluginServices.getText(this, "jpeg_file"), "cms")); |
78 | 2480 | nbrodin | jimiExtensionsSupported.put("png",new MyFileFilter("png", |
79 | 3749 | mcompany | PluginServices.getText(this, "png_file"), "cms")); |
80 | 2480 | nbrodin | jimiExtensionsSupported.put("bmp",new MyFileFilter("bmp", |
81 | 3749 | mcompany | PluginServices.getText(this, "bmp_file"), "cms")); |
82 | 2480 | nbrodin | cmsExtensionsSupported.put("tif",new MyFileFilter("tif", |
83 | 3749 | mcompany | PluginServices.getText(this, "tif_file"), "cms")); |
84 | 2480 | nbrodin | } |
85 | |||
86 | public static boolean saveImageCMS(File fileDst,BufferedImage srcImage) throws RasterDriverException, IOException { |
||
87 | RasterManager manager = (RasterManager)RasterLocator.getManager(); |
||
88 | DataServerWriter data = new RasterizerImage(srcImage);
|
||
89 | RasterWriter writer = null;
|
||
90 | try {
|
||
91 | /*DataServerExplorerParameters eparams = DALLocator.getDataManager().createServerExplorerParameters("FilesystemExplorer");
|
||
92 | eparams.setDynValue("initialpath", fileDst.getAbsolutePath());
|
||
93 | DataServerExplorer serverExplorer = DALLocator.getDataManager().openServerExplorer(eparams.getExplorerName(), eparams);
|
||
94 | NewRasterStoreParameters sparams = (NewRasterStoreParameters)serverExplorer.getAddParameters("Gdal Store");
|
||
95 | sparams.setDataServer((DataServerWriter)processIncrement);
|
||
96 | sparams.setDestination(path, file);
|
||
97 | sparams.setBuffer(buffer);
|
||
98 | sparams.setColorInterpretation(new String[]{ColorInterpretation.GRAY_BAND});
|
||
99 | sparams.setWktProjection(dstoreCopy.getWktProjection());
|
||
100 | sparams.setBand(i);
|
||
101 | sparams.setAffineTransform(affineTransform);
|
||
102 | sparams.setDriverParams(params);
|
||
103 | serverExplorer.add(provider, sparams, true);*/
|
||
104 | |||
105 | Params params = manager.createWriter(fileDst.getAbsolutePath()).getParams(); |
||
106 | params.changeParamValue("blocksize", "7"); //posici?n 7 del array -> 512 |
||
107 | params.changeParamValue("tfw", "false"); |
||
108 | params.changeParamValue("interleave", new Integer(1));//posici?n 1 del array -> PIXEL |
||
109 | writer = manager.createWriter(data, |
||
110 | fileDst.getAbsolutePath(), |
||
111 | 3,
|
||
112 | new AffineTransform(1, 0, 0, -1, 0, 0), |
||
113 | srcImage.getWidth(), |
||
114 | srcImage.getHeight(), |
||
115 | Buffer.TYPE_IMAGE,
|
||
116 | params, |
||
117 | null);
|
||
118 | if (writer == null) { |
||
119 | PluginServices.getLogger().error("No supported Format: " + fileDst.getAbsolutePath());
|
||
120 | return false; |
||
121 | } |
||
122 | } catch (NotSupportedExtensionException e) {
|
||
123 | throw new RasterDriverException(""); |
||
124 | } |
||
125 | try {
|
||
126 | writer.dataWrite(); |
||
127 | } catch (ProcessInterruptedException e) {
|
||
128 | } |
||
129 | writer.writeClose(); |
||
130 | return true; |
||
131 | } |
||
132 | |||
133 | |||
134 | |||
135 | public static boolean saveImageJimi(File fileDst,BufferedImage srcImage) throws Exception{ |
||
136 | try {
|
||
137 | |||
138 | Jimi.putImage(srcImage, fileDst.getAbsolutePath()); |
||
139 | |||
140 | } catch (JimiException e) {
|
||
141 | throw new Exception(fileDst.getAbsolutePath(),e); |
||
142 | } |
||
143 | return true; |
||
144 | |||
145 | } |
||
146 | |||
147 | /**
|
||
148 | * @see org.gvsig.andami.plugins.IExtension#execute(java.lang.String)
|
||
149 | */
|
||
150 | public void execute(String actionCommand) { |
||
151 | JFileChooser jfc = new JFileChooser(lastPath); |
||
152 | |||
153 | jfc.removeChoosableFileFilter(jfc.getAcceptAllFileFilter()); |
||
154 | |||
155 | Iterator<MyFileFilter> iter = cmsExtensionsSupported.values().iterator();
|
||
156 | while (iter.hasNext()){
|
||
157 | jfc.addChoosableFileFilter((FileFilter)iter.next());
|
||
158 | } |
||
159 | |||
160 | iter = jimiExtensionsSupported.values().iterator(); |
||
161 | while (iter.hasNext()){
|
||
162 | jfc.addChoosableFileFilter((FileFilter)iter.next());
|
||
163 | } |
||
164 | |||
165 | jfc.setFileFilter((FileFilter)jimiExtensionsSupported.get("png")); |
||
166 | if (jfc.showSaveDialog(
|
||
167 | (Component) PluginServices.getMainFrame()
|
||
168 | ) == JFileChooser.APPROVE_OPTION) {
|
||
169 | |||
170 | BufferedImage tempImage;
|
||
171 | |||
172 | tempImage = ((AbstractViewPanel) PluginServices.getMDIManager().getActiveWindow()).getImage(); |
||
173 | |||
174 | File f = jfc.getSelectedFile();
|
||
175 | |||
176 | lastPath = f.getParent(); |
||
177 | |||
178 | MyFileFilter filter = (MyFileFilter)jfc.getFileFilter(); |
||
179 | f = filter.normalizeExtension(f); |
||
180 | |||
181 | |||
182 | if (f.exists()){
|
||
183 | int resp = JOptionPane.showConfirmDialog( |
||
184 | (Component) PluginServices.getMainFrame(),
|
||
185 | PluginServices.getText(this,
|
||
186 | "fichero_ya_existe_seguro_desea_guardarlo")+
|
||
187 | "\n"+
|
||
188 | f.getAbsolutePath(), |
||
189 | PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION); |
||
190 | if (resp != JOptionPane.YES_OPTION) { |
||
191 | return;
|
||
192 | } |
||
193 | |||
194 | } |
||
195 | |||
196 | if (filter.getInfo().equalsIgnoreCase("cms")){ |
||
197 | |||
198 | try {
|
||
199 | saveImageCMS(f, tempImage); |
||
200 | } catch (IOException e) { |
||
201 | log.debug("Error exportando la imagen", e);
|
||
202 | } catch (RasterDriverException e) {
|
||
203 | log.debug("Error exportando la imagen", e);
|
||
204 | } |
||
205 | }else if (filter.getInfo().equalsIgnoreCase("jimi")) { |
||
206 | try {
|
||
207 | saveImageJimi(f, tempImage); |
||
208 | } catch (Exception e) { |
||
209 | log.debug("Error exportando la imagen", e);
|
||
210 | } |
||
211 | |||
212 | } |
||
213 | |||
214 | |||
215 | } |
||
216 | } |
||
217 | } |
||
218 | |||
219 | /**
|
||
220 | * Servidor de datos desde un BufferedImage. Cada petici?n es de un tama?o
|
||
221 | * de bloque indicado por el escritor en los par?metros de la llamada por lo
|
||
222 | * que en la siguiente petici?n habr? que escribir el bloque siguiente.
|
||
223 | */
|
||
224 | class RasterizerImage implements DataServerWriter { |
||
225 | private BufferedImage source = null; |
||
226 | private int[] data = null; |
||
227 | private int y = 0; |
||
228 | |||
229 | public RasterizerImage(BufferedImage source) { |
||
230 | this.source = source;
|
||
231 | } |
||
232 | |||
233 | /**
|
||
234 | * Solo necesita implementar el m?todo RGB porque solo se
|
||
235 | * utiliza para exportar la vista.
|
||
236 | */
|
||
237 | public int[] readARGBData(int sX, int sY, int nBand){ |
||
238 | return readData( sX, sY, nBand);
|
||
239 | } |
||
240 | |||
241 | public int[] readData(int sizeX, int sizeY, int nBand) { |
||
242 | if(nBand == 0) { //Con nBand==0 se devuelven las 3 bandas |
||
243 | this.data = this.source.getRGB(0, y, sizeX, sizeY, this.data, 0, sizeX); |
||
244 | y += sizeY; |
||
245 | return this.data; |
||
246 | } |
||
247 | return null; |
||
248 | } |
||
249 | |||
250 | public byte[][] readByteData(int sizeX, int sizeY) { |
||
251 | return null; |
||
252 | } |
||
253 | |||
254 | public double[][] readDoubleData(int sizeX, int sizeY) { |
||
255 | return null; |
||
256 | } |
||
257 | |||
258 | public float[][] readFloatData(int sizeX, int sizeY) { |
||
259 | return null; |
||
260 | } |
||
261 | |||
262 | public int[][] readIntData(int sizeX, int sizeY) { |
||
263 | return null; |
||
264 | } |
||
265 | |||
266 | public short[][] readShortData(int sizeX, int sizeY) { |
||
267 | return null; |
||
268 | } |
||
269 | |||
270 | public int getPercent() { |
||
271 | return 0; |
||
272 | } |
||
273 | |||
274 | public void setAlphaBuffer(Buffer alphaBuffer) { |
||
275 | |||
276 | } |
||
277 | |||
278 | public void setBuffer(Buffer buffer, int nband) { |
||
279 | |||
280 | } |
||
281 | |||
282 | public Buffer getBuffer() { |
||
283 | return null; |
||
284 | } |
||
285 | |||
286 | public void setBand(int nband) { |
||
287 | |||
288 | } |
||
289 | |||
290 | public void dispose() { |
||
291 | // TODO Auto-generated method stub
|
||
292 | |||
293 | } |
||
294 | |||
295 | public Buffer getSource() { |
||
296 | return null; |
||
297 | } |
||
298 | |||
299 | public void setPercent(int value) { |
||
300 | // TODO Auto-generated method stub
|
||
301 | |||
302 | } |
||
303 | } |
||
304 | |||
305 | class MyFileFilter extends FileFilter{ |
||
306 | |||
307 | private String[] extensiones = new String[1]; |
||
308 | private String description = null; |
||
309 | private boolean dirs = true; |
||
310 | private String info = null; |
||
311 | |||
312 | public MyFileFilter(String[] ext, String desc) { |
||
313 | extensiones = ext; |
||
314 | description = desc; |
||
315 | } |
||
316 | |||
317 | public MyFileFilter(String[] ext, String desc,String info) { |
||
318 | extensiones = ext; |
||
319 | description = desc; |
||
320 | this.info = info;
|
||
321 | } |
||
322 | |||
323 | public MyFileFilter(String ext, String desc) { |
||
324 | extensiones[0] = ext;
|
||
325 | description = desc; |
||
326 | } |
||
327 | |||
328 | public MyFileFilter(String ext, String desc,String info) { |
||
329 | extensiones[0] = ext;
|
||
330 | description = desc; |
||
331 | this.info = info;
|
||
332 | } |
||
333 | |||
334 | public MyFileFilter(String ext, String desc, boolean dirs) { |
||
335 | extensiones[0] = ext;
|
||
336 | description = desc; |
||
337 | this.dirs = dirs;
|
||
338 | } |
||
339 | |||
340 | public MyFileFilter(String ext, String desc, boolean dirs,String info) { |
||
341 | extensiones[0] = ext;
|
||
342 | description = desc; |
||
343 | this.dirs = dirs;
|
||
344 | this.info = info;
|
||
345 | } |
||
346 | |||
347 | public boolean accept(File f) { |
||
348 | if (f.isDirectory()) {
|
||
349 | if (dirs) {
|
||
350 | return true; |
||
351 | } else {
|
||
352 | return false; |
||
353 | } |
||
354 | } |
||
355 | for (int i = 0; i < extensiones.length; i++) { |
||
356 | if (extensiones[i].equals("")) { |
||
357 | continue;
|
||
358 | } |
||
359 | if (getExtensionOfAFile(f).equalsIgnoreCase(extensiones[i])) {
|
||
360 | return true; |
||
361 | } |
||
362 | } |
||
363 | |||
364 | return false; |
||
365 | } |
||
366 | |||
367 | /**
|
||
368 | * @see javax.swing.filechooser.FileFilter#getDescription()
|
||
369 | */
|
||
370 | public String getDescription() { |
||
371 | return description;
|
||
372 | } |
||
373 | |||
374 | public String[] getExtensions() { |
||
375 | return extensiones;
|
||
376 | } |
||
377 | |||
378 | public boolean isDirectory(){ |
||
379 | return dirs;
|
||
380 | } |
||
381 | |||
382 | private String getExtensionOfAFile(File file){ |
||
383 | String name;
|
||
384 | int dotPos;
|
||
385 | name = file.getName(); |
||
386 | dotPos = name.lastIndexOf(".");
|
||
387 | if (dotPos < 1){ |
||
388 | return ""; |
||
389 | } |
||
390 | return name.substring(dotPos+1); |
||
391 | } |
||
392 | |||
393 | public File normalizeExtension(File file){ |
||
394 | String ext = getExtensionOfAFile(file);
|
||
395 | if (ext.equals("") || !(this.accept(file))){ |
||
396 | return new File(file.getAbsolutePath() + "." + extensiones[0]); |
||
397 | } |
||
398 | return file;
|
||
399 | } |
||
400 | |||
401 | public String getInfo(){ |
||
402 | return this.info; |
||
403 | } |
||
404 | |||
405 | public void setInfo(String info){ |
||
406 | this.info = info;
|
||
407 | } |
||
408 | |||
409 | } |