Issues (35)

src/Api/CompareImages.php (2 issues)

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
The parameter $i is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

76
    private function resizeImage(/** @scrutinizer ignore-unused */ $i, $source)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
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 ignore-type  annotation

85
        imagecopyresized($t, /** @scrutinizer ignore-type */ $source, 0, 0, 0, 0, 8, 8, $mime[0], $mime[1]);
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