Source of file CompareImages.php
Size: 2,937 Bytes - Last Modified: 2021-12-23T10:38:50+00:00
/var/www/docs.ssmods.com/process/src/src/Api/CompareImages.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | <?php namespace Sunnysideup\AssetsOverview\Api; class CompareImages { public function compare($a, $b) { // main function. returns the hammering distance of two images' bit value $i1 = $this->createImage($a); $i2 = $this->createImage($b); if (! $i1 || ! $i2) { return false; } $i1 = $this->resizeImage($i1, $a); $i2 = $this->resizeImage($i2, $b); imagefilter($i1, IMG_FILTER_GRAYSCALE); imagefilter($i2, IMG_FILTER_GRAYSCALE); $colorMean1 = $this->colorMeanValue($i1); $colorMean2 = $this->colorMeanValue($i2); $bits1 = $this->bits($colorMean1); $bits2 = $this->bits($colorMean2); $hammeringDistance = 0; for ($a = 0; $a < 64; ++$a) { if ($bits1[$a] !== $bits2[$a]) { ++$hammeringDistance; } } return $hammeringDistance; } 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 = [$mime[0], $mime[1]]; switch ($mime['mime']) { case 'image/jpeg': $return[] = 'jpg'; return $return; case 'image/png': $return[] = 'png'; return $return; default: return false; } } private function createImage($i) { // retuns image resource or false if its not jpg or png $mime = $this->mimeType($i); if ('jpg' === $mime[2]) { return imagecreatefromjpeg($i); } if ('png' === $mime[2]) { return imagecreatefrompng($i); } return false; } private function resizeImage($i, $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 = []; $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 [$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 = []; foreach ($colorMean[1] as $color) { $bits[] = $color >= $colorMean[0] ? 1 : 0; } return $bits; } } |