Skip to content

Commit 439c795

Browse files
committed
ext/gd adding imagecompare.
can be useful to detect subtle differences between two images, size, transparent, background ... wise.
1 parent 3618382 commit 439c795

File tree

4 files changed

+110
-1
lines changed

4 files changed

+110
-1
lines changed

ext/gd/gd.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4337,6 +4337,21 @@ PHP_FUNCTION(imageresolution)
43374337
}
43384338
/* }}} */
43394339

4340+
PHP_FUNCTION(imagecompare)
4341+
{
4342+
zval *IM1, *IM2;
4343+
gdImagePtr im1, im2;
4344+
4345+
ZEND_PARSE_PARAMETERS_START(2, 2)
4346+
Z_PARAM_OBJECT_OF_CLASS(IM1, gd_image_ce)
4347+
Z_PARAM_OBJECT_OF_CLASS(IM2, gd_image_ce)
4348+
ZEND_PARSE_PARAMETERS_END();
4349+
4350+
im1 = php_gd_libgdimageptr_from_zval_p(IM1);
4351+
im2 = php_gd_libgdimageptr_from_zval_p(IM2);
4352+
4353+
RETURN_LONG((zend_long)gdImageCompare(im1, im2));
4354+
}
43404355

43414356
/*********************************************************
43424357
*

ext/gd/gd.stub.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,52 @@
338338
*/
339339
const IMG_AFFINE_SHEAR_VERTICAL = UNKNOWN;
340340

341+
/**
342+
* @var int
343+
* @cvalue GD_CMP_IMAGE
344+
*/
345+
const IMG_CMP_IMAGE = UNKNOWN;
346+
/**
347+
* @var int
348+
* @cvalue GD_CMP_NUM_COLORS
349+
*/
350+
const IMG_CMP_NUM_COLORS = UNKNOWN;
351+
/**
352+
* @var int
353+
* @cvalue GD_CMP_COLOR
354+
*/
355+
const IMG_CMP_COLOR = UNKNOWN;
356+
/**
357+
* @var int
358+
* @cvalue GD_CMP_SIZE_X
359+
*/
360+
const IMG_CMP_SIZE_X = UNKNOWN;
361+
/**
362+
* @var int
363+
* @cvalue GD_CMP_SIZE_Y
364+
*/
365+
const IMG_CMP_SIZE_Y = UNKNOWN;
366+
/**
367+
* @var int
368+
* @cvalue GD_CMP_TRANSPARENT
369+
*/
370+
const IMG_CMP_TRANSPARENT = UNKNOWN;
371+
/**
372+
* @var int
373+
* @cvalue GD_CMP_BACKGROUND
374+
*/
375+
const IMG_CMP_BACKGROUND = UNKNOWN;
376+
/**
377+
* @var int
378+
* @cvalue GD_CMP_INTERLACE
379+
*/
380+
const IMG_CMP_INTERLACE = UNKNOWN;
381+
/**
382+
* @var int
383+
* @cvalue GD_CMP_TRUECOLOR
384+
*/
385+
const IMG_CMP_TRUECOLOR = UNKNOWN;
386+
341387
/**
342388
* @var int
343389
* @cvalue GD_BUNDLED
@@ -794,3 +840,5 @@ function imagesetinterpolation(GdImage $image, int $method = IMG_BILINEAR_FIXED)
794840
* @refcount 1
795841
*/
796842
function imageresolution(GdImage $image, ?int $resolution_x = null, ?int $resolution_y = null): array|bool {}
843+
844+
function imagecompare(GdImage $image1, GdImage $image2): int {}

ext/gd/gd_arginfo.h

Lines changed: 17 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/gd/tests/imagecompare.phpt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--TEST--
2+
imagefilter() function test
3+
--EXTENSIONS--
4+
gd
5+
--SKIPIF--
6+
<?php
7+
if (!(imagetypes() & IMG_PNG)) die("skip No PNG support");
8+
?>
9+
--FILE--
10+
<?php
11+
$SAVE_DIR = __DIR__;
12+
$SOURCE_IMG = $SAVE_DIR . "/test.png";
13+
$im1 = imagecreatefrompng($SOURCE_IMG);
14+
$im2 = imagecreatefrompng($SOURCE_IMG);
15+
16+
var_dump(imagecompare($im1, $im2) === 0);
17+
18+
$cl = imagecolorallocate($im2, 255, 0, 0);
19+
imagecolortransparent($im2, $cl);
20+
var_dump((imagecompare($im1, $im2) & IMG_CMP_TRANSPARENT) === IMG_CMP_TRANSPARENT);
21+
22+
$im3 = imagecreate(10, 10);
23+
imagecopyresized($im3, $im2, 0, 0, 0, 0, 10, 10, 10, 10);
24+
var_dump((imagecompare($im1, $im3) & IMG_CMP_SIZE_X) !== 0);
25+
var_dump((imagecompare($im1, $im3) & IMG_CMP_SIZE_Y) !== 0);
26+
--EXPECT--
27+
bool(true)
28+
bool(true)
29+
bool(true)
30+
bool(true)

0 commit comments

Comments
 (0)