home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 309.lha / PBM_PLUS / ppm / ppmhist.c < prev    next >
C/C++ Source or Header  |  1980-12-04  |  2KB  |  80 lines

  1. /* ppmhist.c - read a portable pixmap and compute a color histogram
  2. **
  3. ** Copyright (C) 1989 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include "ppm.h"
  15. #include "ppmcmap.h"
  16.  
  17. #define MAXCOLORS 100000
  18.  
  19. main( argc, argv )
  20. int argc;
  21. char *argv[];
  22.     {
  23.     FILE *ifd;
  24.     pixel **pixels;
  25.     colorhist_vector chv;
  26.     int argn, rows, cols, colors, i;
  27.     pixval maxval;
  28.     int countcompare();
  29.     char *usage = "[ppmfile]";
  30.  
  31.     pm_progname = argv[0];
  32.  
  33.     argn = 1;
  34.  
  35.     if ( argn != argc )
  36.     {
  37.     ifd = pm_openr( argv[argn] );
  38.     argn++;
  39.     }
  40.     else
  41.     ifd = stdin;
  42.  
  43.     if ( argn != argc )
  44.     pm_usage( usage );
  45.  
  46.     pixels = ppm_readppm( ifd, &cols, &rows, &maxval );
  47.  
  48.     pm_close( ifd );
  49.  
  50.     chv = ppm_computecolorhist( pixels, cols, rows, MAXCOLORS, &colors );
  51.     if ( chv == (colorhist_vector) 0 )
  52.     pm_error(
  53.         "too many colors found -- try running the pixmap through ppmquant",
  54.         0,0,0,0,0 );
  55.  
  56.     /* Sort by count. */
  57.     qsort( (char *) chv, colors, sizeof(struct colorhist_item), countcompare );
  58.  
  59.     /* And print the histogram. */
  60.     printf( " r   g   b \tlum\tcount\n" );
  61.     printf( "--- --- ---\t---\t-----\n" );
  62.     for ( i = 0; i < colors; i++ )
  63.     printf(
  64.         "%3d %3d %3d\t%d\t%d\n", PPM_GETR(chv[i].color),
  65.         PPM_GETG(chv[i].color), PPM_GETB(chv[i].color),
  66.         (int) ( PPM_LUMIN( chv[i].color ) + 0.5 ),
  67.         chv[i].value );
  68.     
  69.     ppm_freecolorhist( chv );
  70.  
  71.     exit( 0 );
  72.     }
  73.  
  74. int
  75. countcompare( ch1, ch2 )
  76. colorhist_vector ch1, ch2;
  77.     {
  78.     return ch2->value - ch1->value;
  79.     }
  80.