ImageMagick identify.exe在并行Apache Ant项目中不返回任何东西



我使用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=
                "&quot;$size=getimagesize('@{file}');
                echo($size[0].' '.$size[1]);&quot;"
            />
        </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="&quot;$size=getimagesize('@{file}');
                file_put_contents('${file_temp}', $size[0].' '.$size[1]);&quot;"/>
        </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>

相关内容

  • 没有找到相关文章

最新更新