我使用Apache Ant项目来收集一些关于纹理的信息。在这里,您可以看到一个测试项目,它只执行读取而不执行任何进一步的操作。这是一个最小的集合,它复制了一个讨厌的bug。我发现有时ImageMagick的identify.exe不返回任何东西——我添加了一段代码,如果是这样,强制构建失败。如果我多次运行这个项目,我会得到不稳定的行为。有时项目构建成功,有时会失败,并出现几个失败消息。ImageMagick的开发人员说他们的工具是线程安全的。但是如果identify.exe不是这种情况,那么可以是什么?我真的需要对Apache Ant和ImageMagick有深入了解的人的帮助。
<project default="default">
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
<property name="image_magick_path" location="c:Program FilesImageMagick-6.8.9-Q8"/>
<property name="images_path" location="pathtofolderwithpngimages"/>
<target name="default">
<for param="item" parallel="true">
<path>
<fileset dir="${images_path}">
<patternset id="pattern_images">
<include name="***.png"/>
<include name="***.jpg"/>
<include name="***.gif"/>
<include name="***.bmp"/>
</patternset>
</fileset>
</path>
<sequential>
<local name="image_width"/>
<tex_width file="@{item}" property="image_width"/>
<local name="image_height"/>
<tex_width file="@{item}" property="image_height"/>
<if>
<or>
<equals arg1="${image_width}" arg2=""/>
<equals arg1="${image_height}" arg2=""/>
</or>
<then>
<fail message="Got nothing. But why? Image: @{item}"/>
</then>
</if>
</sequential>
</for>
</target>
<macrodef name="tex_width">
<attribute name="file"/>
<attribute name="property"/>
<sequential>
<exec executable="${image_magick_path}identify.exe" outputproperty="@{property}">
<arg value="-format"/>
<arg value="%w"/>
<arg value="@{file}"/>
</exec>
</sequential>
</macrodef>
<macrodef name="tex_height">
<attribute name="file"/>
<attribute name="property"/>
<sequential>
<exec executable="${image_magick_path}identify.exe" outputproperty="@{property}">
<arg value="-format"/>
<arg value="%h"/>
<arg value="@{file}"/>
</exec>
</sequential>
</macrodef>
</project>
好的,我将在这里写下我是如何解决我的问题的。我希望有一天它能对某人有所帮助。
我发现的第一件事是PHP方法'getimagesize'要快得多,所以我决定切换到它从而杀死主要问题。我写了下面的macrodef来获得图像的宽度和高度:
<macrodef name="getimagesize">
<attribute name="file"/>
<attribute name="propertywidth"/>
<attribute name="propertyheight"/>
<sequential>
<local name="output"/>
<exec executable="php" outputproperty="output">
<arg value="-r"/>
<arg value=
""$size=getimagesize('@{file}');
echo($size[0].' '.$size[1]);""
/>
</exec>
<propertyregex
property="@{propertywidth}"
input="${output}"
regexp="(d*) (d*)"
replace="1"
/>
<propertyregex
property="@{propertyheight}"
input="${output}"
regexp="(d*) (d*)"
replace="2"
/>
</sequential>
</macrodef>
不幸的是,这个macrodef有完全相同的错误。有时在并行运行期间,一些执行任务在输出中没有返回任何内容。我很沮丧,所以我决定写另一个macrodef,我现在使用,最后它工作得很好。我所做的是避免从execo -task的'stdout'中读取任何内容,而是使用tempfile-task。这里是最后一个macrodef:
<macrodef name="getimagesize">
<attribute name="file"/>
<attribute name="propertywidth"/>
<attribute name="propertyheight"/>
<sequential>
<local name="file_dirname"/>
<dirname property="file_dirname" file="@{file}"/>
<local name="file_temp"/>
<tempfile property="file_temp" destdir="${file_dirname}" createfile="true"/>
<exec executable="php">
<arg value="-r"/>
<arg value=""$size=getimagesize('@{file}');
file_put_contents('${file_temp}', $size[0].' '.$size[1]);""/>
</exec>
<local name="file_temp_content"/>
<loadfile property="file_temp_content" srcfile="${file_temp}"/>
<delete file="${file_temp}"/>
<propertyregex
property="@{propertywidth}"
input="${file_temp_content}"
regexp="(d*) (d*)"
replace="1"
/>
<propertyregex
property="@{propertyheight}"
input="${file_temp_content}"
regexp="(d*) (d*)"
replace="2"
/>
</sequential>
</macrodef>