2010-11-04 13 views
5

Según las recomendaciones de la velocidad de la página de Google, quiero Specify image dimensions para "optimizar la representación del navegador".¿Tarea Ant para extraer las dimensiones de la imagen (alto, ancho) desde archivos PNG y JPEG?

especificar una anchura y altura para todos los imágenes permite una representación más rápida por eliminando la necesidad de innecesarios reflujos y vuelve a pintar.

Estoy investigando formas de recorrer los archivos de imagen (PNG, JPEG) en mi proyecto de contenido estático y generar un archivo con la ruta y el nombre de cada archivo de imagen, así como el alto y ancho en píxeles. Luego usaría eso para ayudarme a construir las etiquetas usando los datos del atributo src para buscar los valores que se usarán para los atributos de alto y ancho.

\images\logo.png,100,25 

Mis primeras ideas estaba buscando una tarea ANT, ya que nuestro contenido acumulación estática utiliza Ant para otros fines (como el uso de YUI Compressor en JavaScript y CSS). También estoy abierto a otras ideas, incluidos otros métodos para resolver este problema. Preferiría no tener que hacer este trabajo manualmente.

Respuesta

4

Puede probar este https://github.com/mattwildig/image-size-report-task, que he hecho solo para esta pregunta.

+0

al menos lo intentaron u 1 –

+0

que había esta implementado, pero no lo hizo obtenga esta pregunta actualizada antes de su respuesta. Estoy marcando tu respuesta como aceptada. Gracias. –

0

No estoy al tanto de que una tarea tan fácil esté disponible pero debería ser relativamente simple escribir una. En formato PNG, el tamaño de la imagen se almacena justo al comienzo del archivo en el encabezado IHDR. Hay numerosas muestras de analizadores PNG en Google, por ejemplo, this. Concluye en la tarea de la hormiga y listo.

1

Esto fue lo que implementé hasta ahora (necesita pruebas y limpieza). Básicamente, utilicé Tutorial: Tasks using Properties, Filesets & Paths para iniciarme en una tarea Ant y How to get image height and width using java? para extraer las dimensiones de la imagen. Voy a compararme con la respuesta de Matt antes de implementar.

La escritura de la estructura de prueba de mi proyecto:

<project name="ImagesTask" basedir="." default="test"> 
    <target name="init"> 
     <taskdef name="images" classname="ImageInfoTask" classpath="..\dist\ImageTask.jar"/> 
    </target> 
    <target name="test" depends="init"> 
     <images outputFile="data/images.xml"> 
      <fileset dir="data" includes="images/**/*.jpg"/> 
      <fileset dir="data" includes="images/**/*.gif"/> 
      <fileset dir="data" includes="images/**/*.png"/> 
     </images> 
    </target> 
</project> 

La fuente de Java (sin las importaciones):

public class ImageInfoTask extends Task { 

    private String outputFile; 
    private List fileSetList = new ArrayList(); 
    private PrintStream outputFileStream; 

    public void setOutputFile(String outputFile) { 
     this.outputFile = outputFile.replace("/", File.separator); 
    } 

    public void addFileset(FileSet fileset) { 
     fileSetList.add(fileset); 
    } 

    protected void validate() { 
     if (outputFile == null) { 
      throw new BuildException("file not set"); 
     } 

     if (fileSetList.size() < 1) { 
      throw new BuildException("fileset not set"); 
     } 
    } 

    protected void openOutputFile() throws IOException { 
     FileOutputStream out = new FileOutputStream(this.outputFile); 

     // Connect print stream to the output stream 
     this.outputFileStream = new PrintStream(out, true, "UTF-8"); 

     this.outputFileStream.println("<images>"); 
    } 

    protected void writeImgToOutputFile(String filename, Dimension dim) { 
     String imgTag = " <img src=\"/" + filename.replace("\\", "/") 
       + "\" height=\"" + dim.height + "\" width=\"" + dim.width 
       + "\" />"; 

     this.outputFileStream.println(imgTag); 
    } 

    protected void closeOutputFile() { 
     this.outputFileStream.println("</images>"); 

     this.outputFileStream.close(); 
    } 

    @Override 
    public void execute() { 
     validate(); 

     try { 
      openOutputFile(); 

      for (Iterator itFSets = fileSetList.iterator(); itFSets.hasNext();) { 
       FileSet fs = (FileSet) itFSets.next(); 
       DirectoryScanner ds = fs.getDirectoryScanner(getProject()); 
       String[] includedFiles = ds.getIncludedFiles(); 
       for (int i = 0; i < includedFiles.length; i++) { 
        String filename = includedFiles[i]; 

        Dimension dim = getImageDim(ds.getBasedir() + File.separator + filename); 
        if (dim != null) { 
         writeImgToOutputFile(filename, dim); 
        } 
       } 
      } 

      closeOutputFile(); 
     } catch (IOException ex) { 
      log(ex.getMessage()); 
     } 
    } 

    private Dimension getImageDim(final String path) { 
     Dimension result = null; 
     String suffix = this.getFileSuffix(path); 
     Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix); 
     if (iter.hasNext()) { 
      ImageReader reader = iter.next(); 
      try { 
       ImageInputStream stream = new FileImageInputStream(new File(path)); 
       reader.setInput(stream); 
       int width = reader.getWidth(reader.getMinIndex()); 
       int height = reader.getHeight(reader.getMinIndex()); 
       result = new Dimension(width, height); 
      } catch (IOException e) { 
       log(path + ": " + e.getMessage()); 
      } finally { 
       reader.dispose(); 
      } 
     } 
     return result; 
    } 

    private String getFileSuffix(final String path) { 
     String result = null; 
     if (path != null) { 
      result = ""; 
      if (path.lastIndexOf('.') != -1) { 
       result = path.substring(path.lastIndexOf('.')); 
       if (result.startsWith(".")) { 
        result = result.substring(1); 
       } 
      } 
     } 
     return result; 
    } 
} 
+0

Utilicé el mismo tutorial de hormigas para descubrir cómo usar catálogos de archivos, así que creo que ambas implementaciones son bastante similares en ese lado. No sabía mucho acerca de ImageIO, así que solo leí el archivo en una Imagen Buffered y obtuve las dimensiones de eso. Es por eso que necesitaba establecer java.awt.headless - Estaba haciendo que una barra de menú de Java se disparara cuando ejecutaba el script. Sospecho que el enfoque "puro" de ImageIO que ha usado probablemente será bastante más rápido que mi versión, incluso si el código es un poco más detallado. De todos modos, fue un pequeño proyecto interesante para un domingo por la noche. – matt

Cuestiones relacionadas