Задача Ant для извлечения размеров изображения (высота, ширина) из файлов PNG и JPEG? - PullRequest
5 голосов
/ 04 ноября 2010

В соответствии с рекомендациями Google Page Speed ​​я хочу Указать размеры изображения для «Оптимизировать отображение в браузере».

Указание ширины и высоты для всех изображений позволяет ускорить рендерингустраняя необходимость в ненужных перекомпоновках и перерисовках.

Я исследую способы обхода файлов изображений (PNG, JPEG) в моем проекте с статическим содержимым и выводу файл с путем и именем каждого файла.файл изображения, а также высота и ширина в пикселях.Затем я использовал бы это, чтобы помочь мне сконструировать теги, используя данные атрибута src для поиска значений, используемых для атрибутов высоты и ширины.

\images\logo.png,100,25

Моими первыми идеями был поиск задачи ANT, посколькунаша статическая сборка контента использует Ant для других целей (например, использование YUI Compressor для файлов JavaScript и CSS).Я открыт и для других идей, в том числе для решения этой проблемы.Я бы предпочел не выполнять эту работу вручную.

Ответы [ 3 ]

4 голосов
/ 08 ноября 2010

Вы можете попробовать это https://github.com/mattwildig/image-size-report-task,, которое я сделал только для этого вопроса.

1 голос
/ 08 ноября 2010

Вот что я реализовал до сих пор (нуждается в тестировании и очистке). В основном, используется Учебное пособие: Задачи с использованием свойств, наборов файлов и путей , чтобы начать работу с заданием Ant, и Как получить высоту и ширину изображения с помощью Java? , чтобы извлечь размеры изображения. Я собираюсь сравнить с ответом Мэтта, прежде чем развернуть.

Скрипт тестовой сборки из моего проекта:

<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>

Источник Java (без импорта):

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 голосов
/ 04 ноября 2010

Я не знаю о такой задаче муравья, которая была бы легко доступна, но написать ее было бы относительно просто. В формате PNG размер изображения сохраняется в самом начале файла в заголовке IHDR. В Google есть множество примеров парсеров PNG - например, this . Заверните это в задание муравья, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...