рдпрд╣ рд▓реЗрдЦ рдореЗрд░реЗ рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рдПрдХ рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рдЯреЛрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдо рдирд╣реАрдВ рд▓рд╛рдпрд╛ред рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреМрди рд╣реИ, рд▓реЗрдХрд┐рди рдзрдиреНрдпрд╡рд╛рджрдЖрдЬ, рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╣рдм рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ
рдЗрд╕ рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдЦ рдкрд░ рдЖрдпрд╛ред рдпрд╣ рдПрдХ рдЫрд╡рд┐ рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рд╛, рддреЛ рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдХрд┐ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЙрди рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЦрд╛рдП рдЬреЛ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрдордХ (рд▓реЗрдХрд┐рди рдЫрд╡рд┐рдпрд╛рдВ рд╕реНрд╡рдпрдВ рд╕рдорд╛рди рд╣реИрдВ)ред
рд╢рд╛рдпрдж рдпрд╣ рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдХрд┐рд╕реА рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдареАрдХ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рдкрд╛рд╕ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдХреЛрдб рд╣реИред
рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рд░рдгреА рдХреЛ рдкреНрд░рддреНрдпреЗрдХ i-th рдФрд░ (i + 1) -рде рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╕рд░рдгреА рд╣рдорд╛рд░реА рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рд╣реИ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реВрдк рдореЗрдВ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣реА рд╣реИ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдЫрд╡рд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рдВрдЧ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдордиреЛрд░рдВрдЬрдХ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдХреЛрдб рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡реЗ рдХрдо рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
рдЕрдм рд╣рдо рдХреЛрдб рдкрд░ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред
рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рджреЗ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдХрдХреНрд╖рд╛ рд╣реА рд╣реИ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдЖрдЧреЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рд╣реИред
class ImagesComparer { const BAD_ARGS = 1, UNSUPPORTED_FILETYPE = 2, ERROR_OPEN = 3; public $Images = array(); private $_types = array('', 'gif', 'jpeg', 'png', '', '', 'wbmp', '', '', '', '', ''); public $CompareWithFirst = false; public function __construct($Image1, $Image2 = null) { if (func_num_args() > 2) $Images = func_get_args(); else if (is_array($Image1)) $Images = $Image1; else $Images = array($Image1, $Image2); foreach ($Images as $Image) { if (is_string($Image)) $this->_openImage($Image); else if (is_resource($Image)) $this->Images[] = array($this->_getPixelsDiff($Image), array()); else throw new Exception('Bad arguments.', self::BAD_ARGS); } } private function _getImageType($Image) { $Type = getimagesize($Image); if (!$Type = $this->_types[$Type[2]]) throw new Exception('Image have an unsupported file type.', self::UNSUPPORTED_FILETYPE); return 'imagecreatefrom' . $Type; } private function _openImage($Image) { $Type = $this->_getImageType($Image); $Image = $Type($Image); if (!$Image) throw new Exception('Error opening image.', self::ERROR_OPEN); $this->Images[] = array($this->_getPixelsDiff($Image), array()); imagedestroy($Image); } private function _getPixelsDiff($Image) { $Sample = imagecreatetruecolor(8, 8); imagecopyresampled($Sample, $Image, 0, 0, 0, 0, 8, 8, imagesx($Image), imagesy($Image)); $Pixels = array(); $Color = array(0, 0, 0); for ($y = 0; $y < 8; $y++) { for ($x = 0; $x < 8; $x++) { $Color1 = imagecolorat($Sample, $x, $y); $Color1 = $this->_scale255To9(array( ($Color1 >> 16) & 0xFF, ($Color1 >> 8) & 0xFF, $Color & 0xFF )); if ($x != 0 || $y != 0) { $Pixels[] = array( $Color1[0] - $Color[0], $Color1[1] - $Color[1], $Color1[2] - $Color[2] ); } $Color = $Color1; } } imagedestroy($Sample); return $Pixels; } private function _scale255To9($NumArr) { return array( round($NumArr[0] / 28.3), round($NumArr[1] / 28.3), round($NumArr[2] / 28.3) ); } private function _getDiff($Img1, $Img2) { $Diff = 0; for ($i = 0; $i < 63; $i++) { $Diff += abs($this->Images[$Img1][0][$i][0] - $this->Images[$Img2][0][$i][0]); $Diff += abs($this->Images[$Img1][0][$i][1] - $this->Images[$Img2][0][$i][1]); $Diff += abs($this->Images[$Img1][0][$i][2] - $this->Images[$Img2][0][$i][2]); } return $Diff; } public function Compare() { $count = count($this->Images); if ($this->CompareWithFirst) { for ($i = 1; $i < $count; $i++) { $this->Images[0][1][$i] = $this->_getDiff(0, $i); } } else { for ($i = 0; $i < $count; $i++) { for ($k = $i + 1; $k < $count; $k++) {
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, _getPixelsDiff () рд╡рд┐рдзрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдкрд░ рдХреЙрд▓ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЪрд┐рддреНрд░ рд╕рд░рдгреА рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░рддреА рд╣реИ:
- рдЫрд╡рд┐ рдХреЛ 8x8 рдкрд░ рдХрдо рдХрд░рддрд╛ рд╣реИред
- рдлреВрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реИред
- рдпрд╣ рдЫрд╡рд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ:
- RGB рдореЗрдВ рдЕрдкрдирд╛ рд░рдВрдЧ рд▓реЗрддрд╛ рд╣реИред
- рдкреНрд░рддреНрдпреЗрдХ рдЪреИрдирд▓ 28.3 рдФрд░ рд░рд╛рдЙрдВрдб рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЪреИрдирд▓ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп 9 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛред
- рдкреНрд░рддреНрдпреЗрдХ рдЪреИрдирд▓ рд╕реЗ рдкрд┐рдЫрд▓реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рдореВрд▓реНрдп рдШрдЯрд╛рддрд╛ рд╣реИред
- рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
рдЦреИрд░, рдлрд┐рд░ рддреБрд▓рдирд╛ () рдореЗрдВ, _getDiff () рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдкрд╛рддрд╛ рд╣реИред
рд╡реИрд╕реЗ, рдЗрд╕ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░,
рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЕрдВрддрд░ 1701 (63 * 3 * 9, рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ)ред
рдФрд░ рдЕрдм рдкрд░реАрдХреНрд╖рдгред
рдЪрд┐рддреНрд░реЛрдВ рдХреА рдкрд╣рд▓реА рдЬреЛрдбрд╝реА:
рдПрдХ рдФрд░
рджреЛ ред рдкрд╣рд▓реА рддрд╕реНрд╡реАрд░ рдПрдпрд░ рдЬреЙрд░реНрдбрди рдХрд╛ рд▓реЛрдЧреЛ рд╣реИред рджреВрд╕рд░рд╛ рдмреЗрдВрдбрд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдкреИрд░реЛрдбреА рд╣реИред рд╕рд╣рдордд рд╣реВрдБ, рдЖрдБрдЦреЗрдВ рдмрд╣реБрдд рд╕рдорд╛рди рдЪрд┐рддреНрд░ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЙрдиреНрд╣реЗрдВ 1701 рдореЗрдВ рд╕реЗ 68 рдЕрдВрддрд░ рдЕрдВрдХ рджреЗрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рдд, рдЙрдирдХреА рдкрд╣рдЪрд╛рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд▓рдЧрднрдЧ 96.1% рд╣реИред
рдЪрд┐рддреНрд░реЛрдВ рдХреА рджреВрд╕рд░реА рдЬреЛрдбрд╝реА:
рдПрдХ рдФрд░
рджреЛ ред рдпрд╣ 266 рдХрд╛ рдЕрдВрддрд░ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░рдВрдЧ рдХрд╛рдлреА рд╕рдорд╛рди рд╣реИрдВред рд╡реИрд╕реЗ, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдЖрдВрдХрдбрд╝реЗ 85% рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИрдВред рддреЛ рдмрд╛рд░ (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рджрд╣рд▓реАрдЬ) рдХреЛ рдХрд╛рдлреА рдКрдВрдЪрд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдБ рдХреБрдЫ рдФрд░ рд╣реИ:
рдПрдХ рдФрд░
рджреЛ ред рдЕрдВрддрд░ релреиред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рддрд░реАрдХрд╛ рдЖрджрд░реНрд╢ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред
рдпреБрдкреАрдбреАред рдЗрд╕ рдЫрд╡рд┐ рдФрд░
рдЗрд╕ рдХреА рддреБрд▓рдирд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рджреВрд╕рд░реЗ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛ рдмрд╣реБрдд рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдВрддрд░ 1701 рдореЗрдВ рд╕реЗ 70 рддреЛрддреЗ рдХрд╛ рд╣реИред