嘗試使用 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 個參數,以使用此計算方法來確定影像差異。