Statistics
| Revision:

gvsig-raster / org.gvsig.raster.gdal / trunk / org.gvsig.raster.gdal / org.gvsig.raster.gdal.io / src / main / java / org / gvsig / raster / gdal / io / PngWriter.java @ 488

History | View | Annotate | Download (6.74 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.gdal.io;
23

    
24
import java.awt.geom.AffineTransform;
25
import java.io.File;
26
import java.io.IOException;
27

    
28
import org.cresques.cts.IProjection;
29
import org.gvsig.fmap.dal.coverage.RasterLocator;
30
import org.gvsig.fmap.dal.coverage.datastruct.Params;
31
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
32
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
33
import org.gvsig.raster.gdal.io.features.PngFeatures;
34
import org.gvsig.raster.impl.store.WriteFileFormatFeatures;
35
import org.gvsig.raster.impl.store.writer.DefaultRasterWriter;
36
import org.gvsig.raster.util.DefaultProviderServices;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.extensionpoint.ExtensionPoint;
39
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
40

    
41
import es.gva.cit.jgdal.Gdal;
42
import es.gva.cit.jgdal.GdalDriver;
43
import es.gva.cit.jgdal.GdalException;
44
/**
45
 * Driver para la escritura de Png.
46
 * Este driver utiliza GdalWriter para salvar Png.
47
 * La escritura de un png no es posible utilizando un servidor de datos
48
 * como el que usan los drivers comunes por lo que ser? necesario salvar antes
49
 * a Tif con el driver de Gdal para posteriormente convertir la imagen completa
50
 * a png. El problema que tiene es el mismo del jpg y es que el dataset solo soporta la
51
 * escritura rw y no rw+.
52
 *
53
 * @version 22/07/2008
54
 * @author Nacho Brodin (nachobrodin@gmail.com)
55
 */
56
public class PngWriter extends DefaultRasterWriter {
57

    
58
        // Datos de registro de drivers
59
        public static void register() {
60
                DefaultProviderServices pInfo = (DefaultProviderServices)RasterLocator.getManager().getProviderServices();
61
                ExtensionPointManager extensionPoints =ToolsLocator.getExtensionPointManager();
62
                ExtensionPoint point=extensionPoints.get("RasterWriter");
63
                point.append("png", "", PngWriter.class);
64
                pInfo.getFileFeature().put("png", new PngFeatures());
65
        }
66

    
67
        private GdalWriter gdalWriter = null;
68
        private String     outTif     = null;
69
        private String     outPng     = null;
70

    
71
        /**
72
         * Carga los par?metros de este driver.
73
         */
74
        public void loadParams(String ident) {
75
                WriteFileFormatFeatures wfff = (WriteFileFormatFeatures) pInfo.getFileFeature().get(ident);
76
                wfff.loadParams();
77
                driverParams = wfff.getParams();
78
        }
79

    
80
        /**
81
         * Constructor para la obtenci?n de par?metros del driver
82
         * @param drvType Tipo de driver
83
         */
84
        public PngWriter(String fileName) {
85
                ident = fileUtil.getExtensionFromFileName(fileName);
86
                driver = ((WriteFileFormatFeatures) pInfo.getFileFeature().get(ident)).getDriverName();
87
                gdalWriter = new GdalWriter(fileName);
88

    
89
                loadParams(ident);
90
        }
91

    
92
        /**
93
         * Constructor para salvar datos servidos por el cliente
94
         * @param dataWriter Objeto servidor de datos para el driver de escritura
95
         * @param outSizeX N?mero de pixels en X de la imagen de salida
96
         * @param outSizeY N?mero de pixels en Y de la imagen de salida
97
         * @param outFilename Fichero de salida
98
         * @param extentMaxX Posici?n en X m?xima del extent
99
         * @param extentMinX Posici?n en X m?nima del extent
100
         * @param extentMaxY Posici?n en Y m?xima del extent
101
         * @param extentMinY Posici?n en Y m?nima del extent
102
         * @param nBands N?mero de bandas
103
         * @param drvType Tipo de driver
104
         * @throws GdalException
105
         * @throws IOException
106
         */
107
        public PngWriter(DataServerWriter dataWriter,
108
                                                        String outFileName,
109
                                                        Integer nBands,
110
                                                        AffineTransform at,
111
                                                        Integer outSizeX,
112
                                                        Integer outSizeY,
113
                                                        Integer dataType,
114
                                                        Params params,
115
                                                        IProjection proj,
116
                                                        Boolean geo)throws GdalException, IOException  {
117
                ident = fileUtil.getExtensionFromFileName(outFileName);
118
                driver = ((WriteFileFormatFeatures) pInfo.getFileFeature().get(ident)).getDriverName();
119
                outPng = outFileName;
120
                outTif = outFileName.substring(0, outFileName.lastIndexOf("."));
121
                outTif += ".tif";
122
                this.at = at;
123

    
124
                gdalWriter = new GdalWriter(dataWriter, outTif, nBands, at, outSizeX, outSizeY, dataType, params, proj, geo);
125
                if (params == null)
126
                        loadParams(ident);
127
                else
128
                        this.driverParams = params;
129
        }
130

    
131
        /**
132
         * Asigna el tipo de driver con el que se salvar? la imagen
133
         * @param drvType Tipo de driver
134
         */
135
        public void setDriverType(String drvType) {
136
                gdalWriter.setDriverType(drvType);
137
        }
138

    
139
                /**
140
         * Realiza la funci?n de compresi?n a partir de un GeoRasterFile.
141
         * @throws IOException
142
         */
143
        public void fileWrite() throws IOException, ProcessInterruptedException {
144
                gdalWriter.fileWrite();
145
        }
146

    
147
        /**
148
         * Realiza una copia en el formato especificado.
149
         * @throws IOException
150
         */
151
        public static void createCopy(GdalDriver driverDst, String dst, String src,
152
                        boolean bstrict, String[] params) throws IOException, GdalException {
153
                GdalWriter.createCopy(driverDst, dst, src, bstrict, params);
154
        }
155

    
156
        /**
157
         * Realiza la escritura de datos con los datos que le pasa el cliente.
158
         * @throws IOException
159
         */
160
        public void dataWrite() throws IOException, ProcessInterruptedException {
161
                if(colorInterp != null)
162
                        gdalWriter.setColorBandsInterpretation(colorInterp.getValues());
163
                gdalWriter.dataWrite();
164
                if (gdalWriter.isWrite()) {
165
                        gdalWriter.writeClose();
166
                        if (outTif != null) {
167
                                GdalDriver driver = null;
168
                                try {
169
                                        driver = Gdal.getDriverByName("PNG");
170
                                        GdalWriter.createCopy(driver, outPng, outTif, false, gdalWriter.gdalParamsFromRasterParams(driverParams));
171
                                } catch (GdalException exc) {
172
                                        throw new IOException("No se ha podido obtener el driver.");
173
                                }
174
                                File file = new File(outTif);
175
                                file.delete();
176
                        }
177
                }
178
        }
179

    
180
        /**
181
         * Cancela el salvado de datos.
182
         */
183
        public void writeCancel() {
184
                gdalWriter.setWrite(false);
185
        }
186

    
187
        /*
188
         * (non-Javadoc)
189
         * @see org.gvsig.raster.dataset.GeoRasterWriter#setParams(org.gvsig.raster.dataset.Params)
190
         */
191
        public void setParams(Params params) {
192
                driverParams = params;
193
                if (gdalWriter != null)
194
                        gdalWriter.setParams(params);
195
        }
196

    
197
        /**
198
         * Cierra el compresor ecw.
199
         * @throws GdalException
200
         */
201
        public void writeClose() {
202
        // El close del tif se hizo en dataWrite
203
        }
204

    
205
        public void setWkt(String wkt) {}
206
}