尝试使用 PHPUnit 断言图像?该项目提供了一个约束和允许您这样做所需的断言。
它支持比较磁盘上的文件以及内存中的图像资源。
将此包添加到您的 Composer 开发依赖项中:
composer require --dev meyfa/phpunit-assert-gd
兼容性表
AssertGD版本 | 支持的 PHP 版本 | 支持的 PHPUnit 版本 |
---|---|---|
4.* | >= 8.1 | 10.1 |
3.* | >= 7.3 | 9 |
2.* | >= 7.2 | 8 |
1.* | 5.3.3 - 8.0 | 4.8.36 - 6.5.0 |
断言可作为特征使用,因此您可以轻松地在测试用例类中use
它们:
<?php
use AssertGD GDAssertTrait ;
class ExampleTest extends PHPUnit Framework TestCase
{
// this trait adds the assert methods to your test case
use GDAssertTrait;
public function testSomething ()
{
$ this -> assertSimilarGD ( ' ./tests/expected.png ' , ' ./tests/actual.png ' );
}
}
如果您希望 2 个图像完全相同,请使用assertSimilarGD
。如果您预计会有差异,请使用assertNotSimilarGD
。
$ this -> assertSimilarGD ( ' ./tests/img.png ' , ' ./tests/same.png ' );
$ this -> assertNotSimilarGD ( ' ./tests/img.png ' , ' ./tests/other.png ' );
提供 0 到 1 之间的数字来设置错误阈值。例如,值为 0.2 最多允许 20% 的差异。
$ this -> assertSimilarGD ( ' ./tests/img.png ' , ' ./tests/similar.png ' , '' , 0.2 );
您可以传入 GD 图像资源,而不是文件路径。这样就无需在比较之前将某些内容写入磁盘。
$ img = imagecreatetruecolor ( 10 , 10 );
$ this -> assertSimilarGD ( ' ./tests/empty-10x10.png ' , $ img );
imagedestroy ( $ img );
如果您需要配置模拟对象或执行其他更复杂的匹配调用,请使用isSimilarGD
来获取约束对象(类似于equalTo
、 isTrue
等返回的内容)。
$ this -> assertThat (
' ./tests/actual.png ' ,
$ this -> isSimilarGD ( ' ./tests/expected.png ' )
);
默认情况下,该库通过比较源图像和测试图像每个像素坐标处的 RGBA 颜色通道信息来计算两幅图像之间的差异,并对每个像素之间的差异进行平均以计算差异分数。
这适用于大多数情况,但在某些情况下可能会给出错误的评分,例如包含大量透明度的图像。
另一种计算方法是根据 Alpha 透明度缩放 RGB 颜色通道 - 这意味着透明像素越多,对难度分数的影响越小,以抵消图像本身不易观察到的差异 - 可以通过向第 5 个实例添加新的ScaledRgbChannels
来启用assertSimilarGD
或assertNotSimilarGD
方法的参数。
use AssertGD DiffCalculator ScaledRgbChannels ;
public function testImage ()
{
$ this -> assertSimilarGD (
' expected.png ' ,
' actual.png ' ,
'' ,
0 ,
new ScaledRgbChannels ()
);
}
如果您希望完全自定义此库中的计算方式,您还可以通过创建实现AssertGdDiffCalculator
接口的类来创建自己的计算算法。
实现此接口的类必须提供一个calculate
方法,该方法提供两个GdImage
实例,以及两个图像中要比较的像素的 X 和 Y 坐标(作为ints
)。
该方法应返回0
和1
之间的float
,其中 0 表示完全匹配,1 表示完全相反。
然后,您可以提供该类的实例作为assertSimilarGD
或assertNotSimilarGD
方法的第5 个参数,以使用此计算方法来确定图像差异。