{"id":514,"date":"2008-11-15T22:56:59","date_gmt":"2008-11-16T03:56:59","guid":{"rendered":"http:\/\/www.phpied.com\/?p=514"},"modified":"2008-11-15T22:56:59","modified_gmt":"2008-11-16T03:56:59","slug":"image-diff","status":"publish","type":"post","link":"https:\/\/www.phpied.com\/image-diff\/","title":{"rendered":"image diff"},"content":{"rendered":"<p>Was having fun today with <code>idiff.php<\/code> - a PHP shell script to tell you if two images are visually different by comparing them pixel by pixel. If there's a difference, the script creates a third image - black background with the different pixels in green. Only after writing the script I found that there's an imagemagick command <code>compare<\/code> that does the same \ud83d\ude42<\/p>\n<h3>the script<\/h3>\n<p>The idea is that two GD images are created from the input files, also a third GD image with black background to store the diff. Loop through all the pixels and compare them one by one. If one is different, write a green pixel at the same location of the diff image. <\/p>\n<div class=\"hl-main\">\n<pre><span class=\"hl-inlinetags\">&lt;?php<\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-comment\">\/*<\/span><span class=\"hl-comment\">*\r\n * Shell script to tell if two images are identical.\r\n * If not, a third image is written - black background with the different pixels painted green\r\n * Code partially inspired by and borrowed from <\/span><span class=\"hl-url\">http:\/\/pear.php.net\/Image_Text<\/span><span class=\"hl-comment\"> test cases\r\n <\/span><span class=\"hl-comment\">*\/<\/span><span class=\"hl-code\">\r\n \r\n<\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> check if there's enough input<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-reserved\">if<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-reserved\">empty<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$argv<\/span><span class=\"hl-brackets\">[<\/span><span class=\"hl-number\">1<\/span><span class=\"hl-brackets\">]<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> || <\/span><span class=\"hl-reserved\">empty<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$argv<\/span><span class=\"hl-brackets\">[<\/span><span class=\"hl-number\">2<\/span><span class=\"hl-brackets\">]<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\">\r\n    <\/span><span class=\"hl-reserved\">echo<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-string\">gimme at least two image filenames, please.<\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-special\">\\n<\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-reserved\">echo<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-string\">e.g. &quot;php idiff.php img1.png img2.png&quot;<\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-reserved\">echo<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-special\">\\n<\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-string\">third filename is the image diff, optional, default is &quot;diffy.png&quot;<\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-reserved\">exit<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-number\">1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\">\r\n \r\n<\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> create images<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-var\">$i1<\/span><span class=\"hl-code\"> = @<\/span><span class=\"hl-identifier\">imagecreatefromstring<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-identifier\">file_get_contents<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$argv<\/span><span class=\"hl-brackets\">[<\/span><span class=\"hl-number\">1<\/span><span class=\"hl-brackets\">]<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-var\">$i2<\/span><span class=\"hl-code\"> = @<\/span><span class=\"hl-identifier\">imagecreatefromstring<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-identifier\">file_get_contents<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$argv<\/span><span class=\"hl-brackets\">[<\/span><span class=\"hl-number\">2<\/span><span class=\"hl-brackets\">]<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n \r\n<\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> check if we were given garbage<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-reserved\">if<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-code\">!<\/span><span class=\"hl-var\">$i1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\">\r\n    <\/span><span class=\"hl-reserved\">echo<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-var\">$argv<\/span><span class=\"hl-brackets\">[<\/span><span class=\"hl-number\">1<\/span><span class=\"hl-brackets\">]<\/span><span class=\"hl-code\"> . <\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-string\"> is not a valid image<\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-reserved\">exit<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-number\">1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-reserved\">if<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-code\">!<\/span><span class=\"hl-var\">$i2<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\">\r\n    <\/span><span class=\"hl-reserved\">echo<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-var\">$argv<\/span><span class=\"hl-brackets\">[<\/span><span class=\"hl-number\">2<\/span><span class=\"hl-brackets\">]<\/span><span class=\"hl-code\"> . <\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-string\"> is not a valid image<\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-reserved\">exit<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-number\">1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\">\r\n \r\n<\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> dimensions of the first image<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-var\">$sx1<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-identifier\">imagesx<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$i1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-var\">$sy1<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-identifier\">imagesy<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$i1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n \r\n<\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> compare dimensions<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-reserved\">if<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$sx1<\/span><span class=\"hl-code\"> !== <\/span><span class=\"hl-identifier\">imagesx<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$i2<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> || <\/span><span class=\"hl-var\">$sy1<\/span><span class=\"hl-code\"> !== <\/span><span class=\"hl-identifier\">imagesy<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$i2<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\">\r\n    <\/span><span class=\"hl-reserved\">echo<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-string\">The images are not even the same size<\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-reserved\">exit<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-number\">1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\">\r\n \r\n<\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> create a diff image<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-var\">$diffi<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-identifier\">imagecreatetruecolor<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$sx1<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$sy1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-var\">$green<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-identifier\">imagecolorallocate<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$diffi<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-number\">255<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-identifier\">imagefill<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$diffi<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-identifier\">imagecolorallocate<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$diffi<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n \r\n<\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> increment this counter when encountering a pixel diff<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-var\">$different_pixels<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-code\">;\r\n \r\n<\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> loop x and y<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-reserved\">for<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$x<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-code\">; <\/span><span class=\"hl-var\">$x<\/span><span class=\"hl-code\"> &lt; <\/span><span class=\"hl-var\">$sx1<\/span><span class=\"hl-code\">; <\/span><span class=\"hl-var\">$x<\/span><span class=\"hl-code\">++<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\">\r\n    <\/span><span class=\"hl-reserved\">for<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$y<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-number\">0<\/span><span class=\"hl-code\">; <\/span><span class=\"hl-var\">$y<\/span><span class=\"hl-code\"> &lt; <\/span><span class=\"hl-var\">$sy1<\/span><span class=\"hl-code\">; <\/span><span class=\"hl-var\">$y<\/span><span class=\"hl-code\">++<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\">\r\n \r\n        <\/span><span class=\"hl-var\">$rgb1<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-identifier\">imagecolorat<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$i1<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$x<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$y<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n        <\/span><span class=\"hl-var\">$pix1<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-identifier\">imagecolorsforindex<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$i1<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$rgb1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n \r\n        <\/span><span class=\"hl-var\">$rgb2<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-identifier\">imagecolorat<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$i2<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$x<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$y<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n        <\/span><span class=\"hl-var\">$pix2<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-identifier\">imagecolorsforindex<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$i2<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$rgb2<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n \r\n        <\/span><span class=\"hl-reserved\">if<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$pix1<\/span><span class=\"hl-code\"> !== <\/span><span class=\"hl-var\">$pix2<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> different pixel<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n            <\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> increment and paint in the diff image<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n            <\/span><span class=\"hl-var\">$different_pixels<\/span><span class=\"hl-code\">++;\r\n            <\/span><span class=\"hl-identifier\">imagesetpixel<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$diffi<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$x<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$y<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$green<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n        <\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\">\r\n \r\n    <\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\">\r\n \r\n \r\n<\/span><span class=\"hl-reserved\">if<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-code\">!<\/span><span class=\"hl-var\">$different_pixels<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\">\r\n    <\/span><span class=\"hl-reserved\">echo<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-string\">Image is the same<\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-reserved\">exit<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-number\">0<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-reserved\">else<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\">\r\n    <\/span><span class=\"hl-reserved\">if<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-reserved\">empty<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$argv<\/span><span class=\"hl-brackets\">[<\/span><span class=\"hl-number\">3<\/span><span class=\"hl-brackets\">]<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-brackets\">{<\/span><span class=\"hl-code\">\r\n        <\/span><span class=\"hl-var\">$argv<\/span><span class=\"hl-brackets\">[<\/span><span class=\"hl-number\">3<\/span><span class=\"hl-brackets\">]<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-string\">diffy.png<\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-code\">; <\/span><span class=\"hl-comment\">\/\/<\/span><span class=\"hl-comment\"> default result filename<\/span><span class=\"hl-comment\"><\/span><span class=\"hl-code\">\r\n    <\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\">\r\n    <\/span><span class=\"hl-identifier\">imagepng<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-var\">$diffi<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-var\">$argv<\/span><span class=\"hl-brackets\">[<\/span><span class=\"hl-number\">3<\/span><span class=\"hl-brackets\">]<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-var\">$total<\/span><span class=\"hl-code\"> = <\/span><span class=\"hl-var\">$sx1<\/span><span class=\"hl-code\"> * <\/span><span class=\"hl-var\">$sy1<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-reserved\">echo<\/span><span class=\"hl-code\"> <\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-var\">$different_pixels<\/span><span class=\"hl-string\">\/<\/span><span class=\"hl-var\">$total<\/span><span class=\"hl-string\"> different pixels, or <\/span><span class=\"hl-quotes\">&quot;<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-identifier\">number_format<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-number\">100<\/span><span class=\"hl-code\"> * <\/span><span class=\"hl-var\">$different_pixels<\/span><span class=\"hl-code\"> \/ <\/span><span class=\"hl-var\">$total<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-number\">2<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">, <\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-string\">%<\/span><span class=\"hl-quotes\">'<\/span><span class=\"hl-code\">;\r\n    <\/span><span class=\"hl-reserved\">exit<\/span><span class=\"hl-brackets\">(<\/span><span class=\"hl-number\">1<\/span><span class=\"hl-brackets\">)<\/span><span class=\"hl-code\">;\r\n<\/span><span class=\"hl-brackets\">}<\/span><span class=\"hl-code\">\r\n<\/span><span class=\"hl-inlinetags\">?&gt;<\/span><\/pre>\n<\/div>\n<h3>usage<\/h3>\n<p>Type in the command line something like:<\/p>\n<p><code>php idiff.php img1.png img2.png result.png<\/code><\/p>\n<p>This command will compare <code>img1.png<\/code> with <code>img2.png<\/code>. If they are not the same dimensions, will exit with error code. If their pixels exactly the same will exit with success code 0 and print a success message. If the images are not the same, will write the file <code>result.png<\/code>. <\/p>\n<p>If you omit <code>result.png<\/code>, the generated file will be called <code>diffy.png<\/code><\/p>\n<h3>example<\/h3>\n<p>img1.png:<br \/>\n<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.phpied.com\/wp-content\/uploads\/2008\/11\/img1.png\" alt=\"\" title=\"img1\" width=\"200\" height=\"123\" class=\"alignnone size-full wp-image-515\" \/><\/p>\n<p>img2.png<br \/>\n<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.phpied.com\/wp-content\/uploads\/2008\/11\/img2.png\" alt=\"\" title=\"img2\" width=\"200\" height=\"123\" class=\"alignnone size-full wp-image-516\" \/><\/p>\n<p>running the command:<\/p>\n<pre>&gt;php idiff.php img1.png img2.png\r\n70\/24600 different pixels, or 0.28%<\/pre>\n<p>the result diffy.png:<br \/>\n<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.phpied.com\/wp-content\/uploads\/2008\/11\/diffy.png\" alt=\"\" title=\"diffy\" width=\"200\" height=\"123\" class=\"alignnone size-full wp-image-517\" \/><\/p>\n<h3>imagemagick<\/h3>\n<p>yep, so after I did this I found that imagemagick has a command called <code>compare<\/code> that does the same, only with <a href=\"http:\/\/www.imagemagick.org\/script\/compare.php\">more features<\/a>, like the <a href=\"http:\/\/www.imagemagick.org\/script\/command-line-options.php#fuzz\">-fuzz<\/a> option for example that allows you to specify how different should the pixels be, in order to consider them important.<\/p>\n<p>the command:<\/p>\n<pre>&gt;compare img1.png img2.png diffy-im.png<\/pre>\n<p>the <code>diffy-im.png<\/code> result<br \/>\n<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.phpied.com\/wp-content\/uploads\/2008\/11\/diffy-im.png\" alt=\"\" title=\"diffy-im\" width=\"200\" height=\"123\" class=\"alignnone size-full wp-image-518\" \/><\/p>\n<p>As you can see the different pixels are red and the actual image is a very pale background. Nice.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was having fun today with idiff.php &#8211; a PHP shell script to tell you if two images are visually different by comparing them pixel by pixel. If there&#8217;s a difference, the script creates a third image &#8211; black background with the different pixels in green. Only after writing the script I found that there&#8217;s an [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[41,40],"tags":[143,142,381,380],"_links":{"self":[{"href":"https:\/\/www.phpied.com\/wp-json\/wp\/v2\/posts\/514"}],"collection":[{"href":"https:\/\/www.phpied.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.phpied.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.phpied.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.phpied.com\/wp-json\/wp\/v2\/comments?post=514"}],"version-history":[{"count":0,"href":"https:\/\/www.phpied.com\/wp-json\/wp\/v2\/posts\/514\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.phpied.com\/wp-json\/wp\/v2\/media?parent=514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.phpied.com\/wp-json\/wp\/v2\/categories?post=514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.phpied.com\/wp-json\/wp\/v2\/tags?post=514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}