1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-08 07:36:32 +02:00
Files
php-e107/e107_tests/tests/unit/e_thumbnailTest.php
2021-11-25 10:18:53 -08:00

394 lines
8.8 KiB
PHP

<?php
/**
* e107 website system
*
* Copyright (C) 2008-2020 e107 Inc (e107.org)
* Released under the terms and conditions of the
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
*
*/
class e_thumbnailTest extends \Codeception\Test\Unit
{
/** @var e_thumbnail */
protected $thm;
protected $thumbPath;
protected function _before()
{
require_once(e_HANDLER."e_thumbnail_class.php");
try
{
$this->thm = $this->make('e_thumbnail');
}
catch(Exception $e)
{
self::assertTrue(false, $e->getMessage());
}
$this->thm->setCache(false);
$this->thm->setDebug(true);
$this->thumbPath = codecept_data_dir()."thumbnailTest".DIRECTORY_SEPARATOR;
}
public function testSendImage()
{
$tests = array(
0 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'w' => 222,
'h' => 272,
),
1 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'w' => 100,
'h' => 0,
),
2 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'w' => 0,
'h' => 500,
),
3 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'w' => 200,
'h' => 300,
),
4 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'aw' => 300,
'ah' => 300,
),
5 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'aw' => 600,
'ah' => 200,
),
// default image size
6 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'w' => 0,
'h' => 0,
),
7 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'aw' => 600,
'ah' => 200,
'c' => 't', // crop from top
),
8 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'aw' => 600,
'ah' => 200,
'c' => 'c', // crop at center
),
9 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'aw' => 600,
'ah' => 200,
'c' => 'b', // crop at bottom
),
10 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'aw' => 200,
'ah' => 400,
'c' => 'l', // crop left
),
11 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'aw' => 200,
'ah' => 400,
'c' => 'r', // crop right
),
// PNG at default size.
12 => array (
'src' => 'e_IMAGE/logo.png',
'w' => 0,
'h' => 0,
// 'c' => 'r', // crop right
),
// Resize up a PNG
13 => array (
'src' => 'e_IMAGE/logo.png',
'w' => 400,
'h' => 0,
// 'c' => 'r', // crop right
),
// Test Resize Auto-disabled low resolution icons.
14 => array (
'src' => 'e_IMAGE/e107_icon_32.png',
'w' => 80,
'h' => 0,
// 'c' => 'r', // crop right
),
15 => array (
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'aw' => 80,
'ah' => 0,
// 'c' => 'r', // crop right
),
);
// WebP support added in PHP 7.1+
$ver = (float) phpversion();
if ($ver > 7.0)
{
// $this->markTestSkipped('must be revisited.');
// Test WebP format resize.
$tests[] = array(
'src' => 'e_PLUGIN/gallery/images/beach.webp',
'aw' => 455,
'ah' => 0,
);
// Test Converting JPEG to WebP and resize. (Stored index file is saved with a .jpg extension but encoded as WebP)
$tests[] = array(
'src' => 'e_PLUGIN/gallery/images/butterfly.jpg',
'w' => 222,
'h' => 272,
'type'=>'webp'
);
}
foreach($tests as $index => $val)
{
$this->thm->setRequest($val);
$this->thm->checkSrc();
list($file,$ext) = explode(".",$val['src']);
unset($file);
$generatedImage = $this->thm->sendImage();
$storedImage = $this->thumbPath."image_".$index.".".$ext;
$compare = new compareImages($storedImage);
$diff = $compare->compareWith($generatedImage);
$status = ($diff < 5);
// $actual = getimagesize($generatedImage);
// $expected = getimagesize($storedImage);
if($status === false)
{
rename($generatedImage,codecept_output_dir()."sendImage_".time()."_index_".$index.".".$ext);
}
self::assertTrue($status, "Image Index #".$index." failed the image-comparison check");
}
}
}
/**
* @author ThaoNv - 2016
* Fast PHP compare images
* https://github.com/nvthaovn/CompareImage
* ---------------------------
* @todo Move this class to an appropriate location.
* */
class compareImages
{
public $source = null;
private $hasString = '';
function __construct($source)
{
$this->source = $source;
}
private function mimeType($i)
{
/*returns array with mime type and if its jpg or png. Returns false if it isn't jpg or png*/
$mime = getimagesize($i);
$return = array($mime[0], $mime[1]);
switch ($mime['mime']) {
case 'image/jpeg':
$return[] = 'jpg';
return $return;
case 'image/png':
$return[] = 'png';
return $return;
case 'image/webp':
$return[] = 'webp';
return $return;
case 'image/gif':
$return[] = 'gif';
return $return;
default:
return false;
}
}
private function createImage($i)
{
/*retuns image resource or false if its not jpg or png*/
$mime = $this->mimeType($i);
switch($mime[2])
{
case "jpg":
return imagecreatefromjpeg($i);
break;
case "png":
return @imagecreatefrompng($i);
break;
case "gif":
return imagecreatefromgif($i);
break;
case "webp":
return imagecreatefromwebp($i);
break;
default:
return false;
}
}
private function resizeImage($source)
{
/*resizes the image to a 8x8 squere and returns as image resource*/
$mime = $this->mimeType($source);
$t = imagecreatetruecolor(8, 8);
$source = $this->createImage($source);
imagecopyresized($t, $source, 0, 0, 0, 0, 8, 8, $mime[0], $mime[1]);
return $t;
}
private function colorMeanValue($i)
{
/*returns the mean value of the colors and the list of all pixel's colors*/
$colorList = array();
$colorSum = 0;
for ($a = 0; $a < 8; $a++) {
for ($b = 0; $b < 8; $b++) {
$rgb = imagecolorat($i, $a, $b);
$colorList[] = $rgb & 0xFF;
$colorSum += $rgb & 0xFF;
}
}
return array($colorSum / 64, $colorList);
}
private function bits($colorMean)
{
/*returns an array with 1 and zeros. If a color is bigger than the mean value of colors it is 1*/
$bits = array();
foreach ($colorMean[1] as $color) {
$bits[] = ($color >= $colorMean[0]) ? 1 : 0;
}
return $bits;
}
public function compareWith($tagetImage)
{
$tagetString = $this->hasString($tagetImage);
if ($tagetString) {
return $this->compareHash($tagetString);
}
return 100;
}
/**
* Hash String from image. You can save this string to database for reuse
* @param $image
* @return String 64 character
*/
private function hasString($image)
{
$i1 = $this->createImage($image);
if (!$i1) {
return false;
}
$i1 = $this->resizeImage($image);
imagefilter($i1, IMG_FILTER_GRAYSCALE);
$colorMean1 = $this->colorMeanValue($i1);
$bits1 = $this->bits($colorMean1);
$result = '';
for ($a = 0; $a < 64; $a++) {
$result .= $bits1[$a];
}
return $result;
}
/**
* Get current image hash String
* */
public function getHasString()
{
if ($this->hasString == '') {
$this->hasString = $this->hasString($this->source);
}
return $this->hasString;
}
/**
* Get hash String from image url
* ex: $imageHash = $this->hasStringImage('http://media.com/image.jpg');
* @param $image
* @return false|String
*/
public function hasStringImage($image)
{
return $this->hasString($image);
}
/**
* Compare current image with an image hash String
* @param $imageHash
* @return int different rates . if different rates < 10 => duplicate image
*/
public function compareHash($imageHash)
{
$sString = $this->getHasString();
if (strlen($imageHash) == 64 && strlen($sString) == 64) {
$diff = 0;
$sString = str_split($sString);
$imageHash = str_split($imageHash);
for($a = 0; $a < 64; $a++) {
if ($imageHash[$a] != $sString[$a]) {
$diff++;
}
}
return $diff;
}
return 64;
}
}