From fb2596456dfbe82115cf4f0591cd880ce0ce665f Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Sun, 7 Apr 2013 19:34:15 +0200 Subject: [PATCH] changed default alpha to float values to 0-1 --- src/Intervention/Image/Image.php | 31 +++++-- tests/ImageTest.php | 144 ++++++++++++++++--------------- 2 files changed, 95 insertions(+), 80 deletions(-) diff --git a/src/Intervention/Image/Image.php b/src/Intervention/Image/Image.php index 2992c556..a4364606 100644 --- a/src/Intervention/Image/Image.php +++ b/src/Intervention/Image/Image.php @@ -857,17 +857,17 @@ class Image $alpha = $mask->pickColor($x, $y, 'array'); if ($mask_with_alpha) { - $alpha = $alpha['alpha']; // use alpha channel as mask + $alpha = $alpha['a']; // use alpha channel as mask } else { - $alpha = 127 - floor($alpha['red'] / 2); // use red channel as mask + $alpha = floatval(round($alpha['r'] / 255, 2)); // use red channel as mask } // preserve alpha of original image... - if ($color['alpha'] > $alpha) { - $alpha = $color['alpha']; + if ($color['a'] < $alpha) { + $alpha = $color['a']; } - $pixelColor = $this->parseColor(array($color['red'], $color['green'], $color['blue'], $alpha)); + $pixelColor = array($color['r'], $color['g'], $color['b'], $alpha); $maskedImage->pixel($pixelColor, $x, $y); } } @@ -1245,8 +1245,20 @@ class Image $color = sprintf('#%02x%02x%02x', $color['red'], $color['green'], $color['blue']); break; + case 'int': + case 'integer': + # in gd2 library color already is int... + break; + + default: case 'array': $color = imagecolorsforindex($this->resource, $color); + $color = array( + 'r' => $color['red'], + 'g' => $color['green'], + 'b' => $color['blue'], + 'a' => $this->alpha2rgba($color['alpha']) + ); break; } @@ -1261,7 +1273,7 @@ class Image */ public function parseColor($value) { - $alpha = 0; + $a = 0; // alpha value if (is_int($value)) { @@ -1274,7 +1286,8 @@ class Image if (count($value) == 4) { // color array with alpha value - list($r, $g, $b, $alpha) = $value; + list($r, $g, $b, $a) = $value; + $a = $this->alpha2gd($a); } elseif (count($value) == 3) { @@ -1305,7 +1318,7 @@ class Image $r = ($matches[1] >= 0 && $matches[1] <= 255) ? intval($matches[1]) : 0; $g = ($matches[2] >= 0 && $matches[2] <= 255) ? intval($matches[2]) : 0; $b = ($matches[3] >= 0 && $matches[3] <= 255) ? intval($matches[3]) : 0; - $alpha = $this->alpha2gd($matches[4]); + $a = $this->alpha2gd($matches[4]); } } @@ -1316,7 +1329,7 @@ class Image } elseif (isset($r) && isset($g) && isset($b)) { - return imagecolorallocatealpha($this->resource, $r, $g, $b, $alpha); + return imagecolorallocatealpha($this->resource, $r, $g, $b, $a); } else { diff --git a/tests/ImageTest.php b/tests/ImageTest.php index f638eee4..1c62803f 100644 --- a/tests/ImageTest.php +++ b/tests/ImageTest.php @@ -151,14 +151,14 @@ class ImageTest extends PHPUnit_Framework_Testcase { $img = Image::canvas(100, 100); $color = $img->pickColor(50, 50, 'array'); - $this->assertInternalType('int', $color['red']); - $this->assertInternalType('int', $color['green']); - $this->assertInternalType('int', $color['blue']); - $this->assertInternalType('int', $color['alpha']); - $this->assertEquals($color['red'], 0); - $this->assertEquals($color['green'], 0); - $this->assertEquals($color['blue'], 0); - $this->assertEquals($color['alpha'], 127); + $this->assertInternalType('int', $color['r']); + $this->assertInternalType('int', $color['g']); + $this->assertInternalType('int', $color['b']); + $this->assertInternalType('float', $color['a']); + $this->assertEquals($color['r'], 0); + $this->assertEquals($color['g'], 0); + $this->assertEquals($color['b'], 0); + $this->assertEquals($color['a'], 0); } public function testOpenImage() @@ -532,10 +532,10 @@ class ImageTest extends PHPUnit_Framework_Testcase $this->assertEquals($img->width, 50); $this->assertEquals($img->height, 50); $checkColor = $img->pickColor(0, 0, 'array'); - $this->assertEquals($checkColor['red'], 0); - $this->assertEquals($checkColor['green'], 0); - $this->assertEquals($checkColor['blue'], 0); - $this->assertEquals($checkColor['alpha'], 127); + $this->assertEquals($checkColor['r'], 0); + $this->assertEquals($checkColor['g'], 0); + $this->assertEquals($checkColor['b'], 0); + $this->assertEquals($checkColor['a'], 0); } public function testInsertImage() @@ -804,15 +804,15 @@ class ImageTest extends PHPUnit_Framework_Testcase $this->assertEquals($img->width, 32); $this->assertEquals($img->height, 32); $checkColor = $img->pickColor(15, 15, 'array'); - $this->assertEquals($checkColor['red'], 254); - $this->assertEquals($checkColor['green'], 204); - $this->assertEquals($checkColor['blue'], 112); - $this->assertEquals($checkColor['alpha'], 64); + $this->assertEquals($checkColor['r'], 254); + $this->assertEquals($checkColor['g'], 204); + $this->assertEquals($checkColor['b'], 112); + $this->assertEquals($checkColor['a'], 0.5); $checkColor = $img->pickColor(31, 31, 'array'); - $this->assertEquals($checkColor['red'], 255); - $this->assertEquals($checkColor['green'], 166); - $this->assertEquals($checkColor['blue'], 0); - $this->assertEquals($checkColor['alpha'], 64); + $this->assertEquals($checkColor['r'], 255); + $this->assertEquals($checkColor['g'], 166); + $this->assertEquals($checkColor['b'], 0); + $this->assertEquals($checkColor['a'], 0.5); } public function testMaskImage() @@ -826,15 +826,15 @@ class ImageTest extends PHPUnit_Framework_Testcase $this->assertEquals($img->width, 32); $this->assertEquals($img->height, 32); $checkColor = $img->pickColor(16, 2, 'array'); - $this->assertEquals($checkColor['red'], 254); - $this->assertEquals($checkColor['green'], 230); - $this->assertEquals($checkColor['blue'], 186); - $this->assertEquals($checkColor['alpha'], 22); + $this->assertEquals($checkColor['r'], 254); + $this->assertEquals($checkColor['g'], 230); + $this->assertEquals($checkColor['b'], 186); + $this->assertEquals($checkColor['a'], 0.83); $checkColor = $img->pickColor(31, 31, 'array'); - $this->assertEquals($checkColor['red'], 0); - $this->assertEquals($checkColor['green'], 0); - $this->assertEquals($checkColor['blue'], 0); - $this->assertEquals($checkColor['alpha'], 127); + $this->assertEquals($checkColor['r'], 0); + $this->assertEquals($checkColor['g'], 0); + $this->assertEquals($checkColor['b'], 0); + $this->assertEquals($checkColor['a'], 0); // use alpha channel as mask $img = Image::make('public/test.jpg'); @@ -845,15 +845,15 @@ class ImageTest extends PHPUnit_Framework_Testcase $this->assertEquals($img->width, 32); $this->assertEquals($img->height, 32); $checkColor = $img->pickColor(5, 5, 'array'); - $this->assertEquals($checkColor['red'], 0); - $this->assertEquals($checkColor['green'], 0); - $this->assertEquals($checkColor['blue'], 0); - $this->assertEquals($checkColor['alpha'], 127); + $this->assertEquals($checkColor['r'], 0); + $this->assertEquals($checkColor['g'], 0); + $this->assertEquals($checkColor['b'], 0); + $this->assertEquals($checkColor['a'], 0); $checkColor = $img->pickColor(20, 15, 'array'); - $this->assertEquals($checkColor['red'], 254); - $this->assertEquals($checkColor['green'], 190); - $this->assertEquals($checkColor['blue'], 69); - $this->assertEquals($checkColor['alpha'], 0); + $this->assertEquals($checkColor['r'], 254); + $this->assertEquals($checkColor['g'], 190); + $this->assertEquals($checkColor['b'], 69); + $this->assertEquals($checkColor['a'], 1); // preserve existing alpha channel $img = Image::make('public/circle.png'); @@ -864,15 +864,15 @@ class ImageTest extends PHPUnit_Framework_Testcase $this->assertEquals($img->width, 32); $this->assertEquals($img->height, 32); $checkColor = $img->pickColor(5, 5, 'array'); - $this->assertEquals($checkColor['red'], 0); - $this->assertEquals($checkColor['green'], 0); - $this->assertEquals($checkColor['blue'], 0); - $this->assertEquals($checkColor['alpha'], 127); + $this->assertEquals($checkColor['r'], 0); + $this->assertEquals($checkColor['g'], 0); + $this->assertEquals($checkColor['b'], 0); + $this->assertEquals($checkColor['a'], 0); $checkColor = $img->pickColor(15, 15, 'array'); - $this->assertEquals($checkColor['red'], 0); - $this->assertEquals($checkColor['green'], 0); - $this->assertEquals($checkColor['blue'], 0); - $this->assertEquals($checkColor['alpha'], 25); + $this->assertEquals($checkColor['r'], 0); + $this->assertEquals($checkColor['g'], 0); + $this->assertEquals($checkColor['b'], 0); + $this->assertEquals($checkColor['a'], 0.8); } @@ -1106,8 +1106,20 @@ class ImageTest extends PHPUnit_Framework_Testcase { $img = $this->getTestImage(); + // rgb color array (default) + $color = $img->pickColor(799, 599); + $this->assertInternalType('array', $color); + $this->assertInternalType('int', $color['r']); + $this->assertEquals($color['r'], 255); + $this->assertInternalType('int', $color['g']); + $this->assertEquals($color['g'], 166); + $this->assertInternalType('int', $color['b']); + $this->assertEquals($color['b'], 0); + $this->assertInternalType('float', $color['a']); + $this->assertEquals($color['a'], 1); + // int color - $color = $img->pickColor(100, 100); + $color = $img->pickColor(100, 100, 'int'); $this->assertInternalType('int', $color); $this->assertEquals($color, 16776956); @@ -1121,16 +1133,6 @@ class ImageTest extends PHPUnit_Framework_Testcase $this->assertInternalType('string', $color); $this->assertEquals($color, '#ffa600'); - // rgb color array - $color = $img->pickColor(799, 599, 'array'); - $this->assertInternalType('array', $color); - $this->assertInternalType('int', $color['red']); - $this->assertEquals($color['red'], 255); - $this->assertInternalType('int', $color['green']); - $this->assertEquals($color['green'], 166); - $this->assertInternalType('int', $color['blue']); - $this->assertEquals($color['blue'], 0); - // rgba color string $color = $img->pickColor(799, 599, 'rgba'); $this->assertInternalType('string', $color); @@ -1183,34 +1185,34 @@ class ImageTest extends PHPUnit_Framework_Testcase $img->fill('rgb(255, 0, 0)'); $checkColor = $img->pickColor(50, 50,'array'); - $this->assertEquals($checkColor['red'], 255); - $this->assertEquals($checkColor['green'], 0); - $this->assertEquals($checkColor['blue'], 0); - $this->assertEquals($checkColor['alpha'], 0); + $this->assertEquals($checkColor['r'], 255); + $this->assertEquals($checkColor['g'], 0); + $this->assertEquals($checkColor['b'], 0); + $this->assertEquals($checkColor['a'], 1); $img->rectangle('rgba(0,0,0,0.5)', 0, 0, 100, 100); $checkColor = $img->pickColor(50, 50,'array'); - $this->assertEquals($checkColor['red'], 128); - $this->assertEquals($checkColor['green'], 0); - $this->assertEquals($checkColor['blue'], 0); - $this->assertEquals($checkColor['alpha'], 0); + $this->assertEquals($checkColor['r'], 128); + $this->assertEquals($checkColor['g'], 0); + $this->assertEquals($checkColor['b'], 0); + $this->assertEquals($checkColor['a'], 1); $img = new Image(null, 100, 100); $img->fill('rgba(0,0,0,0.5)'); $checkColor = $img->pickColor(50, 50,'array'); - $this->assertEquals($checkColor['red'], 0); - $this->assertEquals($checkColor['green'], 0); - $this->assertEquals($checkColor['blue'], 0); - $this->assertEquals($checkColor['alpha'], 64); + $this->assertEquals($checkColor['r'], 0); + $this->assertEquals($checkColor['g'], 0); + $this->assertEquals($checkColor['b'], 0); + $this->assertEquals($checkColor['a'], 0.5); $img = new Image(null, 100, 100); $color = imagecolorallocatealpha($img->resource, 0, 0, 255, 60); $img->fill($color); $checkColor = $img->pickColor(50, 50,'array'); - $this->assertEquals($checkColor['red'], 0); - $this->assertEquals($checkColor['green'], 0); - $this->assertEquals($checkColor['blue'], 255); - $this->assertEquals($checkColor['alpha'], 60); + $this->assertEquals($checkColor['r'], 0); + $this->assertEquals($checkColor['g'], 0); + $this->assertEquals($checkColor['b'], 255); + $this->assertEquals($checkColor['a'], 0.53); } public function testBrightnessImage()