根据Google Page Speed建议,我希望Specify image dimensions“优化浏览器呈现。”
指定所有人的宽度和高度 图像允许更快的渲染 消除了不必要的需要 回流和重绘。
我正在研究在静态内容项目中遍历图像文件(PNG,JPEG)的方法,并输出一个文件,其中包含每个图像文件的路径和文件名以及像素的高度和宽度。然后我会使用它来帮助我构建标记,方法是使用src属性数据来查找用于height和width属性的值。
\images\logo.png,100,25
我的第一个想法是寻找ANT任务,因为我们的静态内容构建使用Ant用于其他目的(例如在JavaScript和CSS文件上使用YUI Compressor)。我也对其他想法持开放态度,包括解决这个问题的其他方法。我宁愿不必手动完成这项工作。
答案 0 :(得分:4)
你可以尝试这个https://github.com/mattwildig/image-size-report-task,这是我为这个问题做的。
答案 1 :(得分:1)
这是我到目前为止实施的内容(需要测试和清理)。基本上,使用Tutorial: Tasks using Properties, Filesets & Paths让我开始使用Ant任务,使用How to get image height and width using java?来提取图像尺寸。在部署之前,我将与matt的答案进行比较。
我项目中的测试构建脚本:
<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;
}
}
答案 2 :(得分:0)
我不知道有这样的蚂蚁任务可供使用,但写一个应该相对简单。在PNG格式中,图像大小存储在IHDR标题中文件的开头。 Google上有许多PNG解析器样本 - 例如this。把它包裹在蚂蚁任务中,你就完成了。