gpt4 book ai didi

php - 需要帮助理解 PHPUnit 测试的原始图像二进制数据的差异

转载 作者:行者123 更新时间:2023-12-04 06:16:45 26 4
gpt4 key购买 nike

所以我写了一个单元测试来比较 PHP 中的裁剪图像(使用 imagemagick)。该测试有效,但在一次比较大量图像时遇到了问题。根据创建图像的时间,每个图像都会收到一个直接嵌入到原始数据中的时间戳。我一直在使用正则表达式在比较文件之前提取该时间戳,但似乎每隔一段时间,其中一个图像文件中就会包含额外的原始数据,即使它们完全相同。
举个例子,这是我的一个测试的结果(注意,我将图像的二进制数据作为字符串进行比较):

ImageTest::testAutoCrop

Failed asserting that two strings are equal.

--- Expected

+++ Actual

@@ @@

?n??m?

-?F sO=f??????????^???????w??>

                          ?(???/o????M)???o%tEXt??%tEXt

+?F sO=f??????????^???????w??>

                          ?(???/o????M)???o%tEXt

如您所见……这两个文件之间的唯一区别是预期的图像中包含以下附加字符串:“?%tEXt”。
有人可以帮我理解这个随机数据代表什么吗?这将帮助我弄清楚如何修改我的单元测试,这样这样的问题就不会再发生了。
谢谢,
马尔科姆
PS:如果我需要提供更多信息,请告诉我。

最佳答案

所以我最终想出了解决这个问题的办法。需要澄清的几件事:

  • 我之所以进行单元测试是因为我们的图像服务 Web 应用程序 (PHP) 使用 Imagemagick 来处理所有图像处理、操作、HTML 到图像的转换以及 PDF 到图像的转换(jpg、png、gif、所有非 cmyk、pdf)在我们的主网站上发生的转换。需要确保在我们向此影像服务应用程序添加新功能时,有足够的测试来确保一切仍然正常运行。
  • 我们在每个图像中看到的字符串数据(又名: ?%tEXt )是图像的 exif 数据。 ( http://en.wikipedia.org/wiki/Exchangeable_image_file_format ) 为了比较图片(从 David Andersson 的回复中获得的建议 (https://stackoverflow.com/users/904933/david-andersson),我们需要从图像中完全去除所有评论数据以及创建日期时间戳/修改信息。那样你重新处理简单的图像而不是其他类型的元数据。我们使用以下函数做到了这一点:

  • protected static function _removeTimeStamp( $string, $pdf = false ) {

    /* Note: Assume $string parameter is the image you're planning on cleaning in string format. */

    /* If you're working with a pdf, you need to remove the CreationDate using regex from the string representation. */
    if ( $pdf )
    return preg_replace( '/(CreationDate[^)]+)/', '', $string );

    /* Create a path for the temporary image we're going to need to create that will hold the exif free image */
    $strip_tmp = 'test/strip_tmp';

    /* write contents of string to temp string file */
    file_put_contents( $strip_tmp, $string );

    /* this will remove all exif data along with the date:create and date:modify properties from the image */
    exec( 'convert ' . $strip_tmp . ' -strip +set date:create +set date:modify ' . $strip_tmp . ' 2> /dev/null' );

    /* get the string representation of the new "cleaned" image */
    $result = file_get_contents( $strip_tmp );

    /* delete the temp file */
    unlink( $strip_tmp );

    /* return the cleaned string */
    return $result;

    } // _removeTimeStamp

    这是在将它们相互比较之前在每个图像上运行的(以字符串格式)。希望这可以帮助将来可能做类似事情的人。

    我计划更详细地写一篇关于此的博客文章,以展示我如何处理许多其他测试。当我这样做时,我将使用评论或此答案中的链接更新此问题。希望这可以帮助某人。

    关于php - 需要帮助理解 PHPUnit 测试的原始图像二进制数据的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7149747/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com