Add PHP bindings for setting and getting the image resolution

We expose the image resolution related GD functionality to userland
by introducing `imageresolution()` as getter/setter. Given only the
image argument, it returns the current resolution as indexed array.
Given only a second argument, it sets the horizontal and vertical
resolution to this value. Given three arguments, it sets the horizontal
and vertical resolution to the given arguments, respectively.
This commit is contained in:
Christoph M. Becker 2016-09-19 22:48:22 +02:00
parent 932c20fb8d
commit 209d4220d5
4 changed files with 126 additions and 0 deletions

View File

@ -821,6 +821,12 @@ ZEND_BEGIN_ARG_INFO(arginfo_imagesetinterpolation, 0)
ZEND_ARG_INFO(0, method)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_imageresolution, 0, 0, 1)
ZEND_ARG_INFO(0, im)
ZEND_ARG_INFO(0, res_x)
ZEND_ARG_INFO(0, res_y)
ZEND_END_ARG_INFO()
/* }}} */
/* {{{ gd_functions[]
@ -965,6 +971,8 @@ const zend_function_entry gd_functions[] = {
PHP_FE(imagefilter, arginfo_imagefilter)
PHP_FE(imageconvolution, arginfo_imageconvolution)
PHP_FE(imageresolution, arginfo_imageresolution)
PHP_FE_END
};
/* }}} */
@ -4991,6 +4999,37 @@ PHP_FUNCTION(imagesetinterpolation)
}
/* }}} */
/* {{{ proto array imageresolution(resource im [, res_x, [res_y]])
Get or set the resolution of the image in DPI. */
PHP_FUNCTION(imageresolution)
{
zval *IM;
gdImagePtr im;
zend_long res_x = GD_RESOLUTION, res_y = GD_RESOLUTION;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|ll", &IM, &res_x, &res_y) == FAILURE) {
return;
}
if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(IM), "Image", le_gd)) == NULL) {
RETURN_FALSE;
}
switch (ZEND_NUM_ARGS()) {
case 3:
gdImageSetResolution(im, res_x, res_y);
RETURN_TRUE;
case 2:
gdImageSetResolution(im, res_x, res_x);
RETURN_TRUE;
default:
array_init(return_value);
add_next_index_long(return_value, gdImageResolutionX(im));
add_next_index_long(return_value, gdImageResolutionY(im));
}
}
/* }}} */
/*
* Local variables:
* tab-width: 4

View File

@ -198,6 +198,8 @@ PHP_FUNCTION(imagexbm);
PHP_FUNCTION(imagefilter);
PHP_FUNCTION(imageconvolution);
PHP_FUNCTION(imageresolution);
PHP_GD_API int phpi_get_le_gd(void);
#else

View File

@ -0,0 +1,43 @@
--TEST--
Set and get image resolution of JPEG images
--SKIPIF--
<?php
if (!extension_loaded('gd')) die('skip gd extension not available');
if (!(imagetypes() & IMG_JPEG)) die('skip JPEG support not available');
?>
--FILE--
<?php
$filename = __DIR__ . DIRECTORY_SEPARATOR . 'imageresolution_jpeg.jpeg';
$exp = imagecreate(100, 100);
imagecolorallocate($exp, 255, 0, 0);
imageresolution($exp, 71);
imagejpeg($exp, $filename);
$act = imagecreatefromjpeg($filename);
var_dump(imageresolution($act));
imageresolution($exp, 71, 299);
imagejpeg($exp, $filename);
$act = imagecreatefromjpeg($filename);
var_dump(imageresolution($act));
?>
===DONE===
--EXPECT--
array(2) {
[0]=>
int(71)
[1]=>
int(71)
}
array(2) {
[0]=>
int(71)
[1]=>
int(299)
}
===DONE===
--CLEAN--
<?php
@unlink(__DIR__ . DIRECTORY_SEPARATOR . 'imageresolution_jpeg.jpeg');
?>

View File

@ -0,0 +1,42 @@
--TEST--
Set and get image resolution of PNG images
--SKIPIF--
<?php
if (!extension_loaded('gd')) die('skip gd extension not available');
?>
--FILE--
<?php
$filename = __DIR__ . DIRECTORY_SEPARATOR . 'imageresolution_png.png';
$exp = imagecreate(100, 100);
imagecolorallocate($exp, 255, 0, 0);
imageresolution($exp, 71);
imagepng($exp, $filename);
$act = imagecreatefrompng($filename);
var_dump(imageresolution($act));
imageresolution($exp, 71, 299);
imagepng($exp, $filename);
$act = imagecreatefrompng($filename);
var_dump(imageresolution($act));
?>
===DONE===
--EXPECT--
array(2) {
[0]=>
int(71)
[1]=>
int(71)
}
array(2) {
[0]=>
int(71)
[1]=>
int(299)
}
===DONE===
--CLEAN--
<?php
@unlink(__DIR__ . DIRECTORY_SEPARATOR . 'imageresolution_png.png');
?>