/* * The Npic library and tools * * Copyright (C) 2003 Edouard Thiel * * This program is free software under the terms of the * GNU Lesser General Public License (LGPL) version 2.1. */ /* * npic-diff.c - 19/08/2008 * */ #include void ShowUsage () { printf ( "npic-diff - Compare two images, pixel per pixel.\n" "Usage:\n" " npic-diff -h | -help | --help : print help\n" " npic-diff in1 in2 options : compare pixels\n" "\n" "Options:\n" " -c|-l|-d : convert pixel type to char, long, double for both images\n" " -b : binary comparison (pixel == 0 or != 0)\n" " -p x : max number of printed differences, default is 20\n" "\n" "in1, in2 : image in " NPIC_KNOWN_IMAGE_EXT " format\n" ); } void ArgcExit (int argc, int n) { if (argc < n) { fprintf (stderr, "ERROR: %d argument(s) missing, " "type \"npic-diff -h\" to get help.\n", n-argc); exit (1); } } void ArgShift (int *argc, char **argv[], int n) { *argc -= n; *argv += n; } int main (int argc, char *argv[]) { char *in1, *in2, do_conv = ' '; Npic_image *np1, *np2; int do_bin = 0; long i, maxdiff = 10; ArgcExit (argc, 2); if (strcmp (argv[1], "-h") == 0 || strcmp (argv[1], "-help") == 0 || strcmp (argv[1], "--help") == 0) { ShowUsage (); exit (0); } ArgcExit (argc, 2+1); in1 = argv[1]; in2 = argv[2]; ArgShift (&argc, &argv, 2); while (argc > 1) { if (strcmp (argv[1], "-p") == 0) { ArgcExit (argc, 2+1); maxdiff = atoi(argv[2]); ArgShift (&argc, &argv, 2); } else if (strcmp (argv[1], "-b") == 0) { do_bin = 1; ArgShift (&argc, &argv, 1); } else if (strcmp (argv[1], "-l") == 0 || strcmp (argv[1], "-c") == 0 || strcmp (argv[1], "-d") == 0) { do_conv = argv[1][1]; ArgShift (&argc, &argv, 1); } else { fprintf (stderr, "ERROR: unknown argument \"%s\", " "type \"npic-diff -h\" to get help.\n", argv[1]); exit (1); } } printf ("Loading \"%s\"\n", in1); np1 = NpicReadImage (in1); if (np1 == NULL) exit (1); printf ("Loading \"%s\"\n", in2); np2 = NpicReadImage (in2); if (np2 == NULL) exit (1); switch (do_conv) { case 'c' : NpicConvertImage_c (np1); NpicConvertImage_c (np2); break; case 'l' : NpicConvertImage_l (np1); NpicConvertImage_l (np2); break; case 'd' : NpicConvertImage_d (np1); NpicConvertImage_d (np2); break; } if (do_bin) i = NpicCompareBin (np1, np2, maxdiff); else i = NpicCompare (np1, np2, maxdiff); if (i == 0) { printf ("0 pixels differ, same images\n"); exit (0); } if (i > 0) printf ("%ld pixels differ\n", i); exit (1); }