5


2

PNGおよびJPEGファイルから画像の寸法(高さ、幅)を抽出するAntタスク?

Google Page Speedの推奨に従って、http://code.google.com/speed/page-speed/docs/rendering.html#SpecifyImageDimensions [画像のサイズを指定]で「ブラウザのレンダリングを最適化」します。

_ すべての画像の幅と高さを指定すると、不必要なリフローと再描画の必要性がなくなるため、レンダリングが高速になります。 _

静的コンテンツプロジェクトで画像ファイル(PNG、JPEG)を走査し、各画像ファイルのパスとファイル名、およびピクセル単位の高さと幅を出力する方法を調査しています。 次に、これを使用して、src属性データを使用して、高さと幅の属性に使用する値を検索することにより、タグを作成します。

\images\logo.png,100,25

私の最初のアイデアはANTタスクを探していました。静的コンテンツビルドは他の目的でhttp://ant.apache.org/[Ant]を使用しているためです(http://developer.yahoo.com/yui/compressor/ [ JavaScriptおよびCSSファイルのYUI Compressor])。 この問題を解決する他の方法を含め、他のアイデアも受け入れています。 この作業を手動で行う必要はありません。

3 Answer


4


この質問のために作成したhttps://github.com/mattwildig/image-size-report-taskを試すことができます。


1


ここに私がこれまでに実装したものがありました(テストとクリーンアップが必要です)。 基本的に、http://ant.apache.org/manual/tutorial-tasks-filesets-properties.html [チュートリアル:プロパティ、ファイルセット、パスを使用したタスク]を使用して、Antタスクとhttps:// stackoverflowを開始しました。 com / questions / 672916 / how-to-get-image-height-and-width-using-java [javaを使用して画像の高さと幅を取得する方法]で画像の寸法を抽出します。 展開する前に、マットの答えと比較します。

私のプロジェクトのテストビルドスクリプト:


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("");
    }

    protected void writeImgToOutputFile(String filename, Dimension dim) {
        String imgTag = "  ";

        this.outputFileStream.println(imgTag);
    }

    protected void closeOutputFile() {
        this.outputFileStream.println("");

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


私はそのようなantタスクがすぐに利用できることを知りませんが、それを書くのは比較的簡単なはずです。 PNG形式では、画像サイズはIHDRヘッダーのファイルの先頭に保存されます。 GoogleにはPNGパーサーのサンプルが多数あります。たとえば、http://www.java-tips.org/java-se-tips/java.awt.image/png-file-format-decoder-in-java.html [この]。 antタスクでそれを包むと完了です。