1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
此源码有个阈值可以自己调节,精确度等自测
/*$Colorimg = new Colorimg();
$image=$Colorimg->IMGaction("G:/www/20161220/demo/5.jpg",1,1,50);
//告诉浏览器以图片形式解析
header('content-type:image/jpeg');
imagejpeg($image, "G:/www/20161220/demo/3.jpg");
*/
 
class Colorimg
{
    public $image;//图片
    private $cs;//比对阈值
    public function IMGaction($imgurl,$if_url=1,$if_deflate=0,$cs='50') {
        if($if_url==1) {
            $image $this->ImgcolorCRRATE($imgurl);
        }else{
            $image $imgurl;
        }
        if($if_deflate==1) {
            $image $this->ImgDEFLATE($image);
        }
        //平均值
        $sample $this->ColorGETMEANrgb($image);
 
       $image=$this->ImgsetPIXEL($image,$sample,$cs);
 
        return $image;
 
    }
    /**
     * 打开一张图片
     */
    public function ImgcolorCRRATE($image)
    {
        list($width$height) = getimagesize($image);//获取图片信息
        $img_info getimagesize($image);
        switch ($img_info[2]) {
            case 1:
                $img = imagecreatefromgif($image);
                break;
            case 2:
                $img = imagecreatefromjpeg($image);
                break;
            case 3:
                $img = imagecreatefrompng($image);
                break;
        }
        return $img;
    }
 
    /**
     * $rate为图片长宽最大值
     */
    public function ImgDEFLATE($image$rate '800')
    {
        $w = imagesx($image);
        $h = imagesy($image);
//指定缩放出来的最大的宽度(也有可能是高度)
        $max $rate;
//根据最大值为300,算出另一个边的长度,得到缩放后的图片宽度和高度
        if ($w $h) {
            $w $max;
            $h $h * ($max / imagesx($image));
        else {
            $h $max;
            $w $w * ($max / imagesy($image));
        }
//声明一个$w宽,$h高的真彩图片资源
        $i = imagecreatetruecolor($w$h);
 
//关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
        imagecopyresampled($i$image, 0, 0, 0, 0, $w$h, imagesx($image), imagesy($image));
        return $i;
    }
 
    /**
     * 传入多维数组n个点计算平均值
     *$rgbarrays=array(
     * $rgb1=array(
     * 'r'=>255,
     * 'g'=>255,
     * 'b'=>255
     * )
     * )
     */
    public function ColorRECKmean($rgbarrays)
    {
//获取总共几个点
        $sum count($rgbarrays);
        $mean1['r'] = '';
        $mean1['g'] = '';
        $mean1['b'] = '';
        foreach ($rgbarrays as $rbg) {
            $mean1['r'] += $rbg['r'];
            $mean1['g'] += $rbg['g'];
            $mean1['b'] += $rbg['b'];
        }
        $mean['r'] = intval($mean1['r'] / $sum);
        $mean['g'] = intval($mean1['g'] / $sum);
        $mean['b'] = intval($mean1['b'] / $sum);
        return $mean;
    }
 
    /**
     * 取四个点,返回平均点的rgb数组
     */
    public function ColorGETMEANrgb($image)
    {
        $rgb1 = imagecolorat($image, 0, 0);
        $rgb2 = imagecolorat($image, 0, imagesy($image) - 1);
        $rgb3 = imagecolorat($image, imagesx($image) - 1, 0);
        $rgb4 = imagecolorat($image, imagesx($image) - 1, imagesy($image) - 1);
//平均值
        $sample $this->ColorRECKmean(array($this->ColorRGBresolved($rgb1)), $this->ColorRGBresolved($rgb2), $this->ColorRGBresolved($rgb3), $this->ColorRGBresolved($rgb4));
        return $sample;
    }
 
    public function ImgsetPIXEL($image,$sample,$cs){
        //如果相似就加一个白色的点
        for ($x = 0; $x < imagesx($image); $x++) {
            for ($y = 0; $y < imagesy($image); $y++) {
                $rgb = imagecolorat($image$x$y);
                $than $this->ColorTHANrgb($this->ColorRGBComp($this->ColorRGBresolved($rgb), $sample),$cs);
                if ($than) {
                    $color = imagecolorallocate($image, 255, 255, 255);
                    imagesetpixel($image$x$y$color);
                }
            }
        }
        return $image;
    }
 
    /**
     * 比对颜色相似度
     * $rgb1和$rgb2必须数组$rgb['r']....
     */
    public function ColorRGBComp($rgb1$rgb2)
    {
        $tbsr abs($rgb1['r'] - $rgb2['r']);
        $tbsg abs($rgb1['g'] - $rgb2['g']);
        $tbsb abs($rgb1['b'] - $rgb2['b']);
        $cv = sqrt(pow($tbsr, 2) + pow($tbsg, 2) + pow($tbsb, 2));
        return $cv;
    }
    /**
     *把rgb颜色分解成数组
     *
     */
    function ColorRGBresolved($rgb)
    {
        $img['r'] = intval(($rgb >> 16) & 0xFF);
        $img['g'] = intval(($rgb >> 8) & 0xFF);
        $img['b'] = intval(($rgb) & 0xFF);
        return $img;
    }
 
    /**
     * 对比像素是否相似,相似返回true
     */
    public function ColorTHANrgb($cv$cs)
    {
        if ($cv <=$cs) {
            return true;
        else {
            return false;
        }
    }
}
相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!