]> granicus.if.org Git - php/commitdiff
Add PHP bindings for setting and getting the image resolution
authorChristoph M. Becker <cmbecker69@gmx.de>
Mon, 19 Sep 2016 20:48:22 +0000 (22:48 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Mon, 17 Oct 2016 23:53:39 +0000 (01:53 +0200)
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.

ext/gd/gd.c
ext/gd/php_gd.h
ext/gd/tests/imageresolution_jpeg.phpt [new file with mode: 0644]
ext/gd/tests/imageresolution_png.phpt [new file with mode: 0644]

index 6cfcce8c4cee8067b052fbc4485f644b369acb68..5ed7744a3e8b55eaea53de093f37f8605f6ab953 100644 (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
index 19e7063d9c1cb9c1b8a4ea2c6d57de8c3aa380db..3363283e9d18cd6b4bee5d16138eaeb5f0c50f7c 100644 (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
diff --git a/ext/gd/tests/imageresolution_jpeg.phpt b/ext/gd/tests/imageresolution_jpeg.phpt
new file mode 100644 (file)
index 0000000..a659e26
--- /dev/null
@@ -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');
+?>
diff --git a/ext/gd/tests/imageresolution_png.phpt b/ext/gd/tests/imageresolution_png.phpt
new file mode 100644 (file)
index 0000000..5bb835b
--- /dev/null
@@ -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');
+?>