sunnysideup /
silverstripe-assets_overview
| 1 | <?php |
||||
| 2 | |||||
| 3 | namespace Sunnysideup\AssetsOverview\Api; |
||||
| 4 | |||||
| 5 | class CompareImages |
||||
| 6 | { |
||||
| 7 | public function compare($a, $b) |
||||
| 8 | { |
||||
| 9 | // main function. returns the hammering distance of two images' bit value |
||||
| 10 | $i1 = $this->createImage($a); |
||||
| 11 | $i2 = $this->createImage($b); |
||||
| 12 | |||||
| 13 | if (! $i1 || ! $i2) { |
||||
| 14 | return false; |
||||
| 15 | } |
||||
| 16 | |||||
| 17 | $i1 = $this->resizeImage($i1, $a); |
||||
| 18 | $i2 = $this->resizeImage($i2, $b); |
||||
| 19 | |||||
| 20 | imagefilter($i1, IMG_FILTER_GRAYSCALE); |
||||
| 21 | imagefilter($i2, IMG_FILTER_GRAYSCALE); |
||||
| 22 | |||||
| 23 | $colorMean1 = $this->colorMeanValue($i1); |
||||
| 24 | $colorMean2 = $this->colorMeanValue($i2); |
||||
| 25 | |||||
| 26 | $bits1 = $this->bits($colorMean1); |
||||
| 27 | $bits2 = $this->bits($colorMean2); |
||||
| 28 | |||||
| 29 | $hammeringDistance = 0; |
||||
| 30 | |||||
| 31 | for ($a = 0; $a < 64; ++$a) { |
||||
| 32 | if ($bits1[$a] !== $bits2[$a]) { |
||||
| 33 | ++$hammeringDistance; |
||||
| 34 | } |
||||
| 35 | } |
||||
| 36 | |||||
| 37 | return $hammeringDistance; |
||||
| 38 | } |
||||
| 39 | |||||
| 40 | private function mimeType($i) |
||||
| 41 | { |
||||
| 42 | // returns array with mime type and if its jpg or png. Returns false if it isn't jpg or png |
||||
| 43 | $mime = getimagesize($i); |
||||
| 44 | $return = [$mime[0], $mime[1]]; |
||||
| 45 | |||||
| 46 | switch ($mime['mime']) { |
||||
| 47 | case 'image/jpeg': |
||||
| 48 | $return[] = 'jpg'; |
||||
| 49 | |||||
| 50 | return $return; |
||||
| 51 | case 'image/png': |
||||
| 52 | $return[] = 'png'; |
||||
| 53 | |||||
| 54 | return $return; |
||||
| 55 | default: |
||||
| 56 | return false; |
||||
| 57 | } |
||||
| 58 | } |
||||
| 59 | |||||
| 60 | private function createImage($i) |
||||
| 61 | { |
||||
| 62 | // retuns image resource or false if its not jpg or png |
||||
| 63 | $mime = $this->mimeType($i); |
||||
| 64 | |||||
| 65 | if ('jpg' === $mime[2]) { |
||||
| 66 | return imagecreatefromjpeg($i); |
||||
| 67 | } |
||||
| 68 | |||||
| 69 | if ('png' === $mime[2]) { |
||||
| 70 | return imagecreatefrompng($i); |
||||
| 71 | } |
||||
| 72 | |||||
| 73 | return false; |
||||
| 74 | } |
||||
| 75 | |||||
| 76 | private function resizeImage($i, $source) |
||||
|
0 ignored issues
–
show
|
|||||
| 77 | { |
||||
| 78 | // resizes the image to a 8x8 squere and returns as image resource |
||||
| 79 | $mime = $this->mimeType($source); |
||||
| 80 | |||||
| 81 | $t = imagecreatetruecolor(8, 8); |
||||
| 82 | |||||
| 83 | $source = $this->createImage($source); |
||||
| 84 | |||||
| 85 | imagecopyresized($t, $source, 0, 0, 0, 0, 8, 8, $mime[0], $mime[1]); |
||||
|
0 ignored issues
–
show
It seems like
$source can also be of type false; however, parameter $src_image of imagecopyresized() does only seem to accept GdImage|resource, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 86 | |||||
| 87 | return $t; |
||||
| 88 | } |
||||
| 89 | |||||
| 90 | private function colorMeanValue($i) |
||||
| 91 | { |
||||
| 92 | // returns the mean value of the colors and the list of all pixel's colors |
||||
| 93 | $colorList = []; |
||||
| 94 | $colorSum = 0; |
||||
| 95 | for ($a = 0; $a < 8; ++$a) { |
||||
| 96 | for ($b = 0; $b < 8; ++$b) { |
||||
| 97 | $rgb = imagecolorat($i, $a, $b); |
||||
| 98 | $colorList[] = $rgb & 0xFF; |
||||
| 99 | $colorSum += $rgb & 0xFF; |
||||
| 100 | } |
||||
| 101 | } |
||||
| 102 | |||||
| 103 | return [$colorSum / 64, $colorList]; |
||||
| 104 | } |
||||
| 105 | |||||
| 106 | private function bits($colorMean) |
||||
| 107 | { |
||||
| 108 | // returns an array with 1 and zeros. If a color is bigger than the mean value of colors it is 1 |
||||
| 109 | $bits = []; |
||||
| 110 | |||||
| 111 | foreach ($colorMean[1] as $color) { |
||||
| 112 | $bits[] = $color >= $colorMean[0] ? 1 : 0; |
||||
| 113 | } |
||||
| 114 | |||||
| 115 | return $bits; |
||||
| 116 | } |
||||
| 117 | } |
||||
| 118 |
This check looks for parameters that have been defined for a function or method, but which are not used in the method body.