1 // This may look like C code, but it is really -*- C++ -*- 2 // 3 // Copyright Bob Friesenhahn, 2003 4 // 5 // Test STL colorHistogram function 6 // 7 8 #undef USE_VECTOR 9 #define USE_MAP 10 11 #include <Magick++.h> 12 #include <string> 13 #include <iostream> 14 #include <iomanip> 15 #if defined(USE_VECTOR) 16 # include <vector> 17 # include <utility> 18 #endif 19 #if defined(USE_MAP) 20 # include <map> 21 #endif 22 23 using namespace std; 24 25 using namespace Magick; 26 27 int main( int /*argc*/, char ** argv) 28 { 29 30 // Initialize ImageMagick install location for Windows 31 InitializeMagick(*argv); 32 33 int failures=0; 34 35 try { 36 37 string srcdir(""); 38 if(getenv("SRCDIR") != 0) 39 srcdir = getenv("SRCDIR"); 40 41 // Read image 42 Image image; 43 image.read( srcdir + "test_image.miff" ); 44 45 // Create histogram vector 46 #if defined(USE_MAP) 47 std::map<Color,size_t> histogram; 48 #elif defined(USE_VECTOR) 49 std::vector<std::pair<Color,size_t> > histogram; 50 #endif 51 52 colorHistogram( &histogram, image ); 53 54 // Print out histogram 55 #if (MAGICKCORE_QUANTUM_DEPTH == 8) 56 int quantum_width=3; 57 #elif (MAGICKCORE_QUANTUM_DEPTH == 16) 58 int quantum_width=5; 59 #else 60 int quantum_width=10; 61 #endif 62 63 cout << "Histogram for file \"" << image.fileName() << "\"" << endl 64 << histogram.size() << " entries:" << endl; 65 66 #if defined(USE_MAP) 67 std::map<Color,size_t>::const_iterator p=histogram.begin(); 68 #elif defined(USE_VECTOR) 69 std::vector<std::pair<Color,size_t> >::const_iterator p=histogram.begin(); 70 #endif 71 while (p != histogram.end()) 72 { 73 cout << setw(10) << (int)p->second << ": (" 74 << setw(quantum_width) << (int)p->first.quantumRed() << "," 75 << setw(quantum_width) << (int)p->first.quantumGreen() << "," 76 << setw(quantum_width) << (int)p->first.quantumBlue() << ")" 77 << endl; 78 p++; 79 } 80 } 81 82 catch( Exception &error_ ) 83 { 84 cout << "Caught exception: " << error_.what() << endl; 85 return 1; 86 } 87 catch( exception &error_ ) 88 { 89 cout << "Caught exception: " << error_.what() << endl; 90 return 1; 91 } 92 93 if ( failures ) 94 { 95 cout << failures << " failures" << endl; 96 return 1; 97 } 98 99 return 0; 100 } 101 102