1. applicable scenarios: for example, http://www.teapic.com/list.htm. the corresponding image is displayed in the color column. 2. main program and API explanation: & lt ;? PhpclassMajorColor {// reference color protected $ _ colorsnull; // tolerances protected $ _
1. applicable scenarios: for example, http://www.teapic.com/list.htm. the corresponding image is displayed in the color column.
II. main program and API explanation:
'Imagecreatefrompng ', 'image/jpeg' => 'imagecreatefromjpeg ', 'image/GIF' => 'imagecreatefromgif'); public function _ construct (array $ colors = null) {if (null! ==$ Colors) {$ this-> _ colors = $ colors;} public function setColors (array $ colors) {$ this-> _ colors = $ colors ;} public function setTolerance ($ tolerance) {$ this-> _ tolerance = $ tolerance;} public function setIgnoreColors ($ colors) {$ this-> _ ignoreColors = $ colors ;} public function _ isValidColor ($ confVal, $ val) {if (is_array ($ confVal )) {return $ val >=$ confVal [0] & $ val <= $ confVal [1];} else {return $ val >=$ ConfVal-$ this-> _ tolerance & $ val <= $ confVal + $ this-> _ tolerance ;}} public function getOrderedColors ($ pic) {$ size = getimagesize ($ pic); if (! $ Size) {return false;} $ width = $ size [0]; $ height = $ size [1]; $ mime = $ size ['Mime ']; $ func = isset ($ this-> _ funcs [$ mime])? $ This-> _ funcs [$ mime]: null; if (! $ Func) {return false;} $ im = $ func ($ pic); if (! $ Im) {return false;} $ total = $ width * $ height; $ nums = array (); for ($ I = 0; $ I <$ width; $ I ++) {for ($ m = 0; $ m <$ height; $ m ++) {$ color_index = imagecolorat ($ im, $ I, $ m ); $ color_tran = imagecolorsforindex ($ im, $ color_index); $ alpha = $ color_tran ['alpha']; unset ($ color_tran ['alpha']); if (100 <$ alpha | in_array ($ color_tran, $ this-> _ ignoreColors) {continue ;} foreach ($ this-> _ colors as $ colorid => $ color) {If ($ this-> _ isValidColor ($ color ['red'], $ color_tran ['red']) & $ this-> _ isValidColor ($ color ['green'], $ color_tran ['green']) & $ this-> _ isValidColor ($ color ['blue'], $ color_tran ['blue']) {$ nums [$ colorid] = isset ($ nums [$ colorid])? $ Nums [$ colorid] + 1: 1 ;}}} imagedestroy ($ im); arsort ($ nums); return $ nums;} public function getMajorColor ($ pic) {$ nums = $ this-> getOrderedColors ($ pic); $ keys = array_keys ($ nums); return $ keys [0];}
1. void setColors (array $ colors)
Set the optional color, that is, all colors under "all colors" (white, gray, black ...)
2. void? SetTolerance (int $ tolerance)
Set the tolerance. for example, if the green RGB value is (0,255, 0) and the tolerance is set to 40, then, all colors in the range of-40 <= R <40 & 215 <= G <= 295 &-40 <= B <= 40 will be treated as green.
This method is used to roughly differentiate colors.
3. void? SetIgnoreColors (array? $ Colors)
Set unnecessary colors. For example, the background of most images is white, but we obviously do not want the result to be white. in this case, you can use this method to make it white.
4. array? GetOrderedColors ($ pic)
Obtain the number of matches of various colors (set with setColors) based on $ pic, and sort by matching volume from high to low
The parameter $ pic is the path of the image to be detected.
5. mix? GetMajorColor ($ pic)
Call getOrderedColors internally to return the key of the color with the highest matching quantity.
III. determine the format and scope of $ colors
1. if the color differences in $ colors are obvious, we only need to pass in the color value. internally, we will differentiate the colors based on the tolerance set by setTolerance.
$colors = array(1 => array('red' => 0xff, 'green' => 0xff, 'blue' => 0xff),2 => array('red' => 0xc0, 'green' => 0xc0, 'blue' => 0xc0),2 => array('red' => 0x00, 'green' => 0x00, 'blue' => 0x00),);
2. the setTolerance setting method can only distinguish various colors. if you need more precise control, you need to set the R, G, and B ranges of a specific color respectively.
$colors = array(1 => array('red' => array(189, 230), 'green' => array(189, 230), 'blue' => array(189, 230)),2 => array('red' => array(0, 37), 'green' => array(0, 37), 'blue' => array(0, 37)),3 => array('red' => array(128, 255), 'green' => array(0, 76), 'blue' => array(0, 100)),);
A series of fine-tuning is required until various colors can be clearly distinguished.