meyfa / phpunit-assert-gd
PHPUnit 匹配/断言 GD 图像资源
Requires
- php: >=8.1
- ext-gd: *
- phpunit/phpunit: ^10.1
Requires (Dev)
- phpmd/phpmd: @stable
README
尝试使用 PHPUnit 断言图像?此项目提供了一个约束和所需的断言,允许您进行此操作。
它支持比较磁盘上的文件以及内存中的图像资源。
安装
将此包添加到您的 Composer 开发依赖项
composer require --dev meyfa/phpunit-assert-gd
兼容性表格
示例
断言作为特性可用,因此您可以在测试用例类中轻松使用它们。
<?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'); } }
普通比较
如果预期两个图像完全相等,请使用 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 颜色通道信息来计算两个图像之间的差异,并计算每个像素之间的差异平均值来计算差异分数。
这对于大多数情况都适用,但在某些情况下可能会给出错误的评分,例如包含大量透明度的图像。
可以通过向 assertSimilarGD
或 assertNotSimilarGD
方法的第五个参数添加新的 ScaledRgbChannels
实例来启用一种替代计算方法,该方法根据它们的 alpha 透明度缩放 RGB 颜色通道 - 这意味着更透明的像素将对难度评分的影响较小,以补偿它们在图像本身上的不太明显的差异。
use AssertGD\DiffCalculator\ScaledRgbChannels; public function testImage() { $this->assertSimilarGD( 'expected.png', 'actual.png', '', 0, new ScaledRgbChannels() ); }
自定义差异计算器
如果您希望完全自定义此库中的计算方式,您也可以通过创建一个实现 AssertGd\DiffCalculator
接口的类来创建自己的计算算法。
实现此接口的类必须提供一个 calculate
方法,该方法接受两个 GdImage
实例和两个图像中比较的像素的 X 和 Y 坐标(作为 int
)。
该方法应返回一个介于 0
和 1
之间的 float
,其中 0 是完全匹配,1 是完全相反。
然后,您可以将类的实例作为 assertSimilarGD
或 assertNotSimilarGD
方法的第五个参数提供,以使用此计算方法确定图像差异。