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
main(int,char ** argv)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