/** * Test distance */ public function testDistance() { $this->assertGreaterThan(0.8, Color::create('ff0000')->distance('0000ff')); $this->assertLessThan(0.1, Color::create('ff0000')->distance('f80800')); }
/** * Filter method: colorize * * @param string|\Zork\Image\Color $color * @return \Zork\Image\Image * @throws \Zork\Image\FilterException * @codeCoverageIgnore */ public function filterColorize($color = 'gray') { if (!$color instanceof Color) { $color = Color::create($color); } if (!imagefilter($this->resource, IMG_FILTER_COLORIZE, $color->getRed(), $color->getGreen(), $color->getBlue(), intval($color->getAlpha() * 127 / 255))) { throw new Exception\FilterException('Filter cannot execute'); } }
/** * Assert 2 image files are equals (within a tolerance) * * @param string $expected * @param string $actual * @param string $message * @param float $downscale * @param float $tolerance * @param bool $alpha */ protected function assertImageFileEquals($expected, $actual, $message = '', $downscale = 5, $tolerance = 0.1, $alpha = false) { $expectedInfo = getimagesize($expected); $actualInfo = getimagesize($actual); $this->assertSame(array_slice($expectedInfo, 0, 3), array_slice($actualInfo, 0, 3), $message); list($width, $height, $type) = $actualInfo; $scaleToWidth = max(1, intval($width / $downscale)); $scaleToHeight = max(1, intval($height / $downscale)); $this->assertContains($type, array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG), 'Image types are not comparable'); switch ($type) { case IMAGETYPE_GIF: $expectedInput = imagecreatefromgif($expected); $actualInput = imagecreatefromgif($actual); break; case IMAGETYPE_JPEG: $expectedInput = imagecreatefromjpeg($expected); $actualInput = imagecreatefromjpeg($actual); break; case IMAGETYPE_PNG: $expectedInput = imagecreatefrompng($expected); $actualInput = imagecreatefrompng($actual); break; default: throw new \Exception(); } $expectedCompare = imagecreatetruecolor($scaleToWidth, $scaleToHeight); $actualCompare = imagecreatetruecolor($scaleToWidth, $scaleToHeight); imagecopyresampled($expectedCompare, $expectedInput, 0, 0, 0, 0, $scaleToWidth, $scaleToHeight, $width, $height); imagecopyresampled($actualCompare, $actualInput, 0, 0, 0, 0, $scaleToWidth, $scaleToHeight, $width, $height); $distance = 0; for ($x = 0; $x < $scaleToWidth; $x++) { for ($y = 0; $y < $scaleToHeight; $y++) { $expectedIndex = imagecolorat($expectedCompare, $x, $y); $actualIndex = imagecolorat($actualCompare, $x, $y); @(list($er, $eg, $eb, $ea) = imagecolorsforindex($expectedCompare, $expectedIndex)); @(list($ar, $ag, $ab, $aa) = imagecolorsforindex($actualCompare, $actualIndex)); $ea = $alpha ? intval($ea * 255 / 127) : 0; $aa = $alpha ? intval($aa * 255 / 127) : 0; $expectedColor = new Color($er, $eg, $eb, $ea); $actualColor = new Color($ar, $ag, $ab, $aa); $distance += $expectedColor->distance($actualColor, $alpha); } } $this->assertLessThanOrEqual($tolerance, $distance / $scaleToWidth / $scaleToHeight, $message); }