PHP で画像比較(2)
具体的にどの pixel に差分があるのか抽出するツールを作りました。
尚、全体的に差分が小さい場合には色を明るくして強調表示します。
減色等の後、画像に違いがないかチェックするのに便利です
<?php /* * bitmap diff each pixels. * 2012/07/12- yoya@awm.jp */ function usage() { echo "Usage: php bitmap_diff.php <file1> <file2> <file3>\n"; } if (($argc != 4) || (! is_readable($argv[1])) || (! is_readable($argv[2]))) { usage(); exit (1); } $output_file = $argv[3]; if (is_readable($output_file)) { echo "ERROR: $output_file is exist.".PHP_EOL; usage(); exit (1); } $data1 = file_get_contents($argv[1]); $data2 = file_get_contents($argv[2]); $im1 = imagecreatefromstring($data1); $im2 = imagecreatefromstring($data2); if (($im1 === false) || ($im2 === false)) { echo "Error: image1 or image2 has broken."; exit (1); } $width1 = imagesx($im1); $height1 = imagesy($im1); $width2 = imagesx($im2); $height2 = imagesy($im2); if (($width1 != $width2) || ($height1 != $height2)) { echo "Error: image1(".$width1."x".$height1.") image2(".$width2."x".$height2.\ ")\n"; exit (1); } $width = $width1; $height = $height1; $im3 = imagecreatetruecolor($width, $height); $pixeldata = array(); $max_diff = 0; for ($y = 0 ; $y < $height ; $y++) { for ($x = 0 ; $x < $width ; $x++) { $i1 = imagecolorat($im1, $x, $y); $i2 = imagecolorat($im2, $x, $y); $rgb1 = imagecolorsforindex($im1, $i1); $rgb2 = imagecolorsforindex($im2, $i2); $red_diff = abs($rgb2['red'] - $rgb1['red']); $green_diff = abs($rgb2['green'] - $rgb1['green']); $blue_diff = abs($rgb2['blue'] - $rgb1['blue']); $pixeldiff []= array($red_diff, $green_diff, $blue_diff); $max_diff = max($max_diff, max($red_diff, max($green_diff, $blue_diff)))\ ; } } foreach ($pixeldiff as $idx => $diff) { $pixeldiff[$idx] = array($diff[0] * 255 / $max_diff, $diff[1] * 255 / $max_diff, $diff[2] * 255 / $max_diff); } $i = 0; for ($y = 0 ; $y < $height ; $y++) { for ($x = 0 ; $x < $width ; $x++) { $diff = $pixeldiff[$i++]; $color = imagecolorallocate($im3, $diff[0], $diff[1], $diff[2]); imagesetpixel($im3, $x, $y, $color); } } imagepng($im3, $output_file);