blob: d1e47e846ce3b8dd73486a5fd0a0c16a607f5d5f [file] [log] [blame]
cristydcca3fa2010-12-29 21:50:07 +00001<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
cristy2bd2a982011-02-15 00:52:58 +00003<html version="-//W3C//DTD XHTML 1.1//EN"
4 xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6 xsi:schemaLocation="http://www.w3.org/1999/xhtml
7 http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd">
cristy3eaa0ef2010-03-06 20:35:26 +00008<head>
cristy3c98a4f2010-08-13 20:09:41 +00009 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
cristy1efc1ab2011-08-01 14:47:02 +000010 <meta name="google-site-verification" content="MxsMq6bdLOx0KSuz1MY6yG9ZTIJ7_7DVRfl5NCAT5Yg"/>
cristyffb69ed2010-12-25 00:06:48 +000011 <title>ImageMagick: MagickCore, C API for ImageMagick: Reduce the Number of Unique Colors in an Image</title>
cristy3ed852e2009-09-05 21:47:34 +000012 <meta http-equiv="Content-Language" content="en-US"/>
13 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
14 <meta http-equiv="Reply-to" content="magick-users@imagemagick.org"/>
cristy3c98a4f2010-08-13 20:09:41 +000015 <meta name="Application-name" content="ImageMagick"/>
cristye6e84152011-06-06 14:16:49 +000016 <meta name="Description" content="Use ImageMagick to convert, edit, or compose bitmap images in a variety of formats. In addition resize, rotate, shear, distort and transform images automagically."/>
cristy3c98a4f2010-08-13 20:09:41 +000017 <meta name="Application-url" content="http://www.imagemagick.org"/>
cristy3ed852e2009-09-05 21:47:34 +000018 <meta name="Generator" content="PHP"/>
cristyeed6cb62012-01-28 19:38:34 +000019 <meta name="Keywords" content="magickcore, c, api, for, imagemagick:, reduce, the, number, of, unique, colors, in, an, image, ImageMagick, PerlMagick, image processing, OpenMP, software development library, image, photo, software, Magick++, MagickWand"/>
cristy3ed852e2009-09-05 21:47:34 +000020 <meta name="Rating" content="GENERAL"/>
21 <meta name="Robots" content="INDEX, FOLLOW"/>
22 <meta name="Generator" content="ImageMagick Studio LLC"/>
23 <meta name="Author" content="ImageMagick Studio LLC"/>
24 <meta name="Revisit-after" content="2 DAYS"/>
25 <meta name="Resource-type" content="document"/>
cristy1454be72011-12-19 01:52:48 +000026 <meta name="Copyright" content="Copyright (c) 1999-2012 ImageMagick Studio LLC"/>
cristy3ed852e2009-09-05 21:47:34 +000027 <meta name="Distribution" content="Global"/>
cristydcca3fa2010-12-29 21:50:07 +000028 <link rel="icon" href="../../images/wand.png"/>
cristy3c98a4f2010-08-13 20:09:41 +000029 <link rel="shortcut icon" href="../../images/wand.ico" type="images/x-icon"/>
cristy29c5c992011-06-25 13:58:49 +000030 <link rel="canonical" href="http://www.imagemagick.org" />
cristy3c98a4f2010-08-13 20:09:41 +000031 <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf"/>
cristyeed6cb62012-01-28 19:38:34 +000032 <!-- Add jQuery library -->
33 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
34
35 <!-- Optionaly include easing and/or mousewheel plugins -->
36 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/jquery.easing-1.3.pack.js"></script>
37 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/jquery.mousewheel-3.0.6.pack.js"></script>
38
39 <!-- Add fancyBox -->
40 <link rel="stylesheet" href="http://www.imagemagick.org/fancybox/jquery.fancybox.css?v=2.0.3" type="text/css" media="screen" />
41 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/jquery.fancybox.pack.js?v=2.0.3"></script>
42
43 <!-- Optionaly include button and/or thumbnail helpers -->
44 <link rel="stylesheet" href="http://www.imagemagick.org/fancybox/helpers/jquery.fancybox-buttons.css?v=2.0.3" type="text/css" media="screen" />
45 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/helpers/jquery.fancybox-buttons.js?v=2.0.3"></script>
46
47 <link rel="stylesheet" href="http://www.imagemagick.org/fancybox/helpers/jquery.fancybox-thumbs.css?v=2.0.3" type="text/css" media="screen" />
48 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/helpers/jquery.fancybox-thumbs.js?v=2.0.3"></script>
49 <script type="text/javascript">
50 $(document).ready(function() {
51 $(".fancybox").fancybox();
52 });
53 </script>
54 <!-- ImageMagick style -->
cristy7a40ba82011-01-08 20:31:18 +000055 <link rel="stylesheet" href="http://www.google.com/cse/style/look/default.css" type="text/css" />
cristy3c98a4f2010-08-13 20:09:41 +000056 <style type="text/css" media="all">
57 @import url("../../www/magick.css");
58 </style>
cristy3eaa0ef2010-03-06 20:35:26 +000059</head>
60
61<body id="www-imagemagick-org">
62<div class="titlebar">
cristyb52981c2011-03-19 17:09:31 +000063<div style="margin: 17px auto; float: left;">
64 <script type="text/javascript">
65 <!--
66 google_ad_client = "pub-3129977114552745";
67 google_ad_slot = "5439289906";
68 google_ad_width = 728;
69 google_ad_height = 90;
70 //-->
71 </script>
72 <script type="text/javascript"
73 src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
74 </script>
75</div>
cristy3eaa0ef2010-03-06 20:35:26 +000076<a href="http://www.imagemagick.org/discourse-server/">
cristyaf8d6652011-02-04 21:57:45 +000077 <img src="../../images/logo.jpg"
78 alt="ImageMagick Logo"
cristy178edaf2011-01-23 03:42:39 +000079 style="width: 123px; height: 118px; border: 0px; float: right;" /></a>
cristy3eaa0ef2010-03-06 20:35:26 +000080<a href="../../index.html">
cristyaf8d6652011-02-04 21:57:45 +000081 <img src="../../images/sprite.jpg"
82 alt="ImageMagick Sprite"
cristy3eaa0ef2010-03-06 20:35:26 +000083 style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
84</div>
85
cristyce69bb02010-07-27 19:49:46 +000086<div class="westbar">
cristy3eaa0ef2010-03-06 20:35:26 +000087
cristy3ed852e2009-09-05 21:47:34 +000088<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000089 <a title="About ImageMagick" href="../../index.html">About ImageMagick</a>
cristy3ed852e2009-09-05 21:47:34 +000090</div>
cristy3ed852e2009-09-05 21:47:34 +000091<div class="menu">
cristybb503372010-05-27 20:51:26 +000092 <a title="Binary Releases" href="../../www/binary-releases.html">Binary Releases</a>
93</div>
94<div class="sub">
95 <a title="Binary Release: Unix" href="../../www/binary-releases.html#unix">Unix</a>
96</div>
97<div class="sub">
98 <a title="Binary Release: MacOS X" href="../../www/binary-releases.html#macosx">Mac OS X</a>
99</div>
100<div class="sub">
cristye6e84152011-06-06 14:16:49 +0000101 <a title="Binary Release: iOS" href="../../www/binary-releases.html#iOS">iOS</a>
cristyda16f162011-02-19 23:52:17 +0000102</div>
103<div class="sub">
cristybb503372010-05-27 20:51:26 +0000104 <a title="Binary Release: Windows" href="../../www/binary-releases.html#windows">Windows</a>
105</div>
106<div class="sep"></div>
107<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000108 <a title="Command-line Tools" href="../../www/command-line-tools.html">Command-line Tools</a>
cristy3ed852e2009-09-05 21:47:34 +0000109</div>
110<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000111 <a title="Command-line Tools: Processing" href="../../www/command-line-processing.html">Processing</a>
cristy3ed852e2009-09-05 21:47:34 +0000112</div>
113<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000114 <a title="Command-line Tools: Options" href="../../www/command-line-options.html">Options</a>
cristy3ed852e2009-09-05 21:47:34 +0000115</div>
116<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000117 <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
cristy3ed852e2009-09-05 21:47:34 +0000118</div>
119<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000120 <a title="Program Interfaces" href="../../www/api.html">Program Interfaces</a>
cristy3ed852e2009-09-05 21:47:34 +0000121</div>
122<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000123 <a title="Program Interface: MagickWand" href="../../www/magick-wand.html">MagickWand</a>
cristy3ed852e2009-09-05 21:47:34 +0000124</div>
125<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000126 <a title="Program Interface: MagickCore" href="../../www/magick-core.html">MagickCore</a>
cristy3ed852e2009-09-05 21:47:34 +0000127</div>
128<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000129 <a title="Program Interface: PerlMagick" href="../../www/perl-magick.html">PerlMagick</a>
cristy3ed852e2009-09-05 21:47:34 +0000130</div>
131<div class="sub">
cristydcca3fa2010-12-29 21:50:07 +0000132 <a title="Program Interface: Magick++" href="../../www/magick++.html">Magick++</a>
cristy3ed852e2009-09-05 21:47:34 +0000133</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000134<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000135<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000136 <a title="Install from Source" href="../../www/install-source.html">Install from Source</a>
cristy3ed852e2009-09-05 21:47:34 +0000137</div>
138<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000139 <a title="Install from Source: Unix" href="../../www/install-source.html#unix">Unix</a>
cristy3ed852e2009-09-05 21:47:34 +0000140</div>
141<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000142 <a title="Install from Source: Windows" href="../../www/install-source.html#windows">Windows</a>
cristy3ed852e2009-09-05 21:47:34 +0000143 </div>
144<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000145 <a title="Resources" href="../../www/resources.html">Resources</a>
cristy3ed852e2009-09-05 21:47:34 +0000146</div>
cristybb503372010-05-27 20:51:26 +0000147<div class="menu">
148 <a title="Architecture" href="../../www/architecture.html">Architecture</a>
149</div>
cristy3ed852e2009-09-05 21:47:34 +0000150<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000151 <a title="Download" href="../../www/download.html">Download</a>
cristy3ed852e2009-09-05 21:47:34 +0000152</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000153<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000154<div class="menu">
cristy52923442011-01-15 22:54:31 +0000155 <a title="Search" href="../../www/search.html">Search</a>
cristy3ed852e2009-09-05 21:47:34 +0000156</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000157<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000158<div class="menu">
cristyffb69ed2010-12-25 00:06:48 +0000159 <a title="Site Map" href="../../www/sitemap.html">Site Map</a>
cristy3ed852e2009-09-05 21:47:34 +0000160</div>
161<div class="sub">
cristyffb69ed2010-12-25 00:06:48 +0000162 <a title="Site Map: Links" href="../../www/links.html">Links</a>
cristy3ed852e2009-09-05 21:47:34 +0000163</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000164<div class="sep"></div>
cristyeed6cb62012-01-28 19:38:34 +0000165<div class="menu">
cristy10549a12011-05-15 19:04:46 +0000166 <a rel="follow" title="Sponsors" href="../../www/sponsors.html">Sponsors:</a>
cristy3ed852e2009-09-05 21:47:34 +0000167
cristyeed6cb62012-01-28 19:38:34 +0000168 <a href="http://www.networkredux.com"> <img src="../../images/networkredux.png" width="140" height="31" alt="[sponsor]" style="margin-top: 4px; margin-left: 4px; border: 0px; float: left;" /></a>
169 <a href="http://www.dinodirect.com/ipads-tablets/"> <img src="../../images/dino-direct.jpg" width="140" height="90" alt="[sponsor]" style="margin-top: 4px; margin-left: 4px; border: 0px; float: left;" /></a><!-- 201204010120 mickey@163... -->
cristy3ed852e2009-09-05 21:47:34 +0000170<div class="sponsbox">
cristyeed6cb62012-01-28 19:38:34 +0000171<div class="sponsor">
172 <a rel="follow" title="Android Tablet" href="http://www.dinodirect.com/ipads-tablets/">Android Tablet</a><!-- 201204010120 mickey@163... -->
cristy81492d62011-06-07 16:41:42 +0000173</div>
cristyeed6cb62012-01-28 19:38:34 +0000174<div class="sponsor">
cristyaf894d72011-08-06 23:03:10 +0000175 <a rel="follow" title="Sponsor: Web Hosting" href="http://www.micfo.com">Web Hosting</a><!-- 209901010090s golestan -->
cristy1efc1ab2011-08-01 14:47:02 +0000176</div>
cristyeed6cb62012-01-28 19:38:34 +0000177<div class="sponsor">
178 <a rel="follow" title="Sponsor: Autos Part" href="http://www.pkwteile.de/autoteile">Autos Part</a><!-- 201203010270 info@pkwte... -->
cristy84134182011-06-15 22:59:00 +0000179</div>
cristyeed6cb62012-01-28 19:38:34 +0000180<div class="sponsor">
181 <a rel="follow" title="Sponsor: Web Site Hosting" href="http://webhostinggeeks.com">Web Site Hosting</a><!-- 201302010900 funds@enmob... -->
cristy81492d62011-06-07 16:41:42 +0000182</div>
cristyeed6cb62012-01-28 19:38:34 +0000183<div class="sponsor">
184 <a rel="follow" title="Sponsor: Tenant Check" href="http://www.rentmethod.com/">Tenant Check</a><!-- 201203010090 chris@rentm... -->
cristyba1758d2011-06-03 01:29:12 +0000185</div>
cristyeed6cb62012-01-28 19:38:34 +0000186<div class="sponsor">
187 <a rel="follow" title="Sponsor: VPS" href="http://www.interdominios.com/vps">VPS</a><!-- 201204010090 barsh@inter... -->
cristyaf894d72011-08-06 23:03:10 +0000188</div>
cristyeed6cb62012-01-28 19:38:34 +0000189<div class="sponsor">
190 <a rel="follow" title="Sponsor: Premium Quality Stock Photos" href="http://www.f1online.pro/en/">Premium Quality Stock Photos</a><!-- 2012080100540 ... -->
191</div>
192<div class="sponsor">
193 <a rel="follow" title="Sponsor: Search engine optimisation" href="http://www.seomoves.com.au">Search engine optimisation</a><!-- 201301010090s jen@seo lowprofilelinks -->
194</div>
195<div class="sponsor">
196 <a rel="follow" title="Sponsor: Druckerei" href="http://print24.com/de/">Druckerei</a><!-- 2012070100250 ... -->
197</div>
198<div class="sponsor">
199 <a rel="follow" title="Sponsor: Managed Server" href="http://www.robhost.de">Managed Server</a><!-- 201210010720 klikics... -->
200</div>
201<div class="sponsor">
202 <a rel="follow" title="Sponsor: Stock Photography" href="http://www.fotosearch.com/">Stock Photography</a><!-- 2012040100250 ... -->
203</div>
204<div class="sponsor">
205 <a rel="follow" title="Sponsor: Autoteile" href="http://www.q11-shop.de">Autoteile</a><!-- 201205010540 suvalj -->
206</div>
207<div class="sponsor">
208 <a rel="follow" title="Sponsor: Royalty Free Stock Images" href="http://www.canstockphoto.com/">Royalty Free Stock Images</a><!-- 2012050100360 support@can -->
209</div>
210<div class="sponsor">
cristyba1758d2011-06-03 01:29:12 +0000211 <a rel="follow" title="Sponsor: Web Hosting Reviews" href="http://www.webhostingsecretrevealed.com">Web Hosting Secret Revealed</a><!-- 201204010540 iamchee jerry -->
212</div>
cristyeed6cb62012-01-28 19:38:34 +0000213<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000214 <a rel="follow" title="Sponsor: Druckerei" href="http://www.allesdruck.de">Druckerei</a><!-- 201303011500 r.leo -->
cristy4c54bbb2011-03-17 13:53:13 +0000215</div>
cristyeed6cb62012-01-28 19:38:34 +0000216<div class="sponsor">
217 <a rel="follow" title="Sponsor: Computer Wallpaper" href="http://www.free-computer-wallpapers.com">Computer Wallpaper</a><!-- 2012030100150 webinvasion1@y...-->
cristy4bf6e232011-05-21 01:43:33 +0000218</div>
cristyeed6cb62012-01-28 19:38:34 +0000219<div class="sponsor">
220 <a rel="follow" title="Sponsor: Brand shopping" href="http://brandport.net">Brand shopping</a><!-- 20120201000150 gyaku@gyaku... -->
cristyec6b4752011-01-08 03:16:23 +0000221</div>
cristy3ed852e2009-09-05 21:47:34 +0000222</div>
223</div>
cristyce69bb02010-07-27 19:49:46 +0000224</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000225
cristyce69bb02010-07-27 19:49:46 +0000226<div class="eastbar">
cristy29c5c992011-06-25 13:58:49 +0000227 <div class="g-plusone" data-size="standard" data-count="false"></div>
cristyeed6cb62012-01-28 19:38:34 +0000228 <script type="text/javascript">
229 window.___gcfg = {
230 lang: 'en-US'
231 };
232
233 (function() {
234 var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
235 po.src = 'https://apis.google.com/js/plusone.js';
236 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
237 })();
238 </script>
cristy29c5c992011-06-25 13:58:49 +0000239</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000240
241<div class="main">
242
cristy20398432011-08-11 01:31:50 +0000243<h1>Module quantize Methods</h1>
244<p class="navigation-index">[<a href="#QuantizeImage">QuantizeImage</a> &bull; <a href="#AcquireQuantizeInfo">AcquireQuantizeInfo</a> &bull; <a href="#CloneQuantizeInfo">CloneQuantizeInfo</a> &bull; <a href="#CompressImageColormap">CompressImageColormap</a> &bull; <a href="#DestroyQuantizeInfo">DestroyQuantizeInfo</a> &bull; <a href="#GetImageQuantizeError">GetImageQuantizeError</a> &bull; <a href="#GetQuantizeInfo">GetQuantizeInfo</a> &bull; <a href="#PosterizeImage">PosterizeImage</a> &bull; <a href="#QuantizeImage">QuantizeImage</a> &bull; <a href="#QuantizeImages">QuantizeImages</a> &bull; <a href="#RemapImage">RemapImage</a> &bull; <a href="#RemapImages">RemapImages</a> &bull; <a href="#SetGrayscaleImage">SetGrayscaleImage</a>]</p>
cristy6f77f692011-02-15 15:31:39 +0000245
cristy20398432011-08-11 01:31:50 +0000246<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="QuantizeImage">QuantizeImage</a></h2>
247<div class="doc-section">
248
249<p>QuantizeImage() takes a standard RGB or monochrome images and quantizes them down to some fixed number of colors.</p>
250
251<p>For purposes of color allocation, an image is a set of n pixels, where each pixel is a point in RGB space. RGB space is a 3-dimensional vector space, and each pixel, Pi, is defined by an ordered triple of red, green, and blue coordinates, (Ri, Gi, Bi).</p>
252
253<p>Each primary color component (red, green, or blue) represents an intensity which varies linearly from 0 to a maximum value, Cmax, which corresponds to full saturation of that color. Color allocation is defined over a domain consisting of the cube in RGB space with opposite vertices at (0,0,0) and (Cmax, Cmax, Cmax). QUANTIZE requires Cmax = 255.</p>
254
255<p>The algorithm maps this domain onto a tree in which each node represents a cube within that domain. In the following discussion these cubes are defined by the coordinate of two opposite vertices:</p>
256
257<pre class="text">
258 the origin.
259</pre>
260
261<p>The tree's root node represents the entire domain, (0,0,0) through (Cmax,Cmax,Cmax). Each lower level in the tree is generated by subdividing one node's cube into eight smaller cubes of equal size. This corresponds to bisecting the parent cube with planes passing through the midpoints of each edge.</p>
262
263<p>The basic algorithm operates in three phases: Classification, Reduction, and Assignment. Classification builds a color description tree for the image. Reduction collapses the tree until the number it represents, at most, the number of colors desired in the output image. Assignment defines the output image's color map and sets each pixel's color by restorage_class in the reduced tree. Our goal is to minimize the numerical discrepancies between the original colors and quantized colors (quantization error).</p>
264
265<p>Classification begins by initializing a color description tree of sufficient depth to represent each possible input color in a leaf. However, it is impractical to generate a fully-formed color description tree in the storage_class phase for realistic values of Cmax. If colors components in the input image are quantized to k-bit precision, so that Cmax= 2k-1, the tree would need k levels below the root node to allow representing each possible input color in a leaf. This becomes prohibitive because the tree's total number of nodes is 1 + sum(i=1, k, 8k).</p>
266
267<p>A complete tree would require 19,173,961 nodes for k = 8, Cmax = 255.</p>
268<h5>avoid building a fully populated tree, QUANTIZE</h5>
269<p>(1) Initializes data structures for nodes only as they are needed; (2) Chooses a maximum depth for the tree as a function of the desired number of colors in the output image (currently log2(colormap size)).</p>
270
271<p>For each pixel in the input image, storage_class scans downward from the root of the color description tree. At each level of the tree it identifies the single node which represents a cube in RGB space containing the pixel's color. It updates the following data for each such node:</p>
272
273<pre class="text">
274 n1: Number of pixels whose color is contained in the RGB cube which
275 this node represents;
276</pre>
277
278<p>n2: Number of pixels whose color is not represented in a node at lower depth in the tree; initially, n2 = 0 for all nodes except leaves of the tree.</p>
279
280<p>Sr, Sg, Sb: Sums of the red, green, and blue component values for all pixels not classified at a lower depth. The combination of these sums and n2 will ultimately characterize the mean color of a set of pixels represented by this node.</p>
281
282<p>E: the distance squared in RGB space between each pixel contained within a node and the nodes' center. This represents the quantization error for a node.</p>
283
284<p>Reduction repeatedly prunes the tree until the number of nodes with n2 > 0 is less than or equal to the maximum number of colors allowed in the output image. On any given iteration over the tree, it selects those nodes whose E count is minimal for pruning and merges their color statistics upward. It uses a pruning threshold, Ep, to govern node selection as follows:</p>
285
286<p>Ep = 0 while number of nodes with (n2 > 0) > required maximum number of colors prune all nodes such that E <= Ep Set Ep to minimum E in remaining nodes</p>
287
288<p>This has the effect of minimizing any quantization error when merging two nodes together.</p>
289
290<p>When a node to be pruned has offspring, the pruning procedure invokes itself recursively in order to prune the tree from the leaves upward. n2, Sr, Sg, and Sb in a node being pruned are always added to the corresponding data in that node's parent. This retains the pruned node's color characteristics for later averaging.</p>
291
292<p>For each node, n2 pixels exist for which that node represents the smallest volume in RGB space containing those pixel's colors. When n2 > 0 the node will uniquely define a color in the output image. At the beginning of reduction, n2 = 0 for all nodes except a the leaves of the tree which represent colors present in the input image.</p>
293
294<p>The other pixel count, n1, indicates the total number of colors within the cubic volume which the node represents. This includes n1 - n2 pixels whose colors should be defined by nodes at a lower level in the tree.</p>
295
296<p>Assignment generates the output image from the pruned tree. The output</p>
297<h5>parts</h5>
298<p>(1) A color map, which is an array of color descriptions (RGB triples) for each color present in the output image; (2) A pixel array, which represents each pixel as an index into the color map array.</p>
299
300<p>First, the assignment phase makes one pass over the pruned color description tree to establish the image's color map. For each node with n2 > 0, it divides Sr, Sg, and Sb by n2 . This produces the mean color of all pixels that classify no lower than this node. Each of these colors becomes an entry in the color map.</p>
301
302<p>Finally, the assignment phase reclassifies each pixel in the pruned tree to identify the deepest node containing the pixel's color. The pixel's value in the pixel array becomes the index of this node's mean color in the color map.</p>
303
304<p>This method is based on a similar algorithm written by Paul Raveling.</p>
305
306 </div>
307<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="AcquireQuantizeInfo">AcquireQuantizeInfo</a></h2>
308<div class="doc-section">
309
310<p>AcquireQuantizeInfo() allocates the QuantizeInfo structure.</p>
311
312<p>The format of the AcquireQuantizeInfo method is:</p>
313
314<pre class="code">
315 QuantizeInfo *AcquireQuantizeInfo(const ImageInfo *image_info)
316</pre>
317
318<p>A description of each parameter follows:</p>
319
320<h5>image_info</h5>
321<p>the image info.</p>
322
323 </div>
324<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="CloneQuantizeInfo">CloneQuantizeInfo</a></h2>
325<div class="doc-section">
326
327<p>CloneQuantizeInfo() makes a duplicate of the given quantize info structure, or if quantize info is NULL, a new one.</p>
328
329<p>The format of the CloneQuantizeInfo method is:</p>
330
331<pre class="code">
332 QuantizeInfo *CloneQuantizeInfo(const QuantizeInfo *quantize_info)
333</pre>
334
335<p>A description of each parameter follows:</p>
336
337<h5>clone_info</h5>
338<p>Method CloneQuantizeInfo returns a duplicate of the given quantize info, or if image info is NULL a new one.</p>
339
340<h5>quantize_info</h5>
341<p>a structure of type info.</p>
342
343 </div>
344<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="CompressImageColormap">CompressImageColormap</a></h2>
345<div class="doc-section">
346
347<p>CompressImageColormap() compresses an image colormap by removing any duplicate or unused color entries.</p>
348
349<p>The format of the CompressImageColormap method is:</p>
350
351<pre class="code">
352 MagickBooleanType CompressImageColormap(Image *image)
353</pre>
354
355<p>A description of each parameter follows:</p>
356
357<h5>image</h5>
358<p>the image.</p>
359
360 </div>
361<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="DestroyQuantizeInfo">DestroyQuantizeInfo</a></h2>
362<div class="doc-section">
363
364<p>DestroyQuantizeInfo() deallocates memory associated with an QuantizeInfo structure.</p>
365
366<p>The format of the DestroyQuantizeInfo method is:</p>
367
368<pre class="code">
369 QuantizeInfo *DestroyQuantizeInfo(QuantizeInfo *quantize_info)
370</pre>
371
372<p>A description of each parameter follows:</p>
373
374<h5>quantize_info</h5>
375<p>Specifies a pointer to an QuantizeInfo structure.</p>
376
377 </div>
378<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="GetImageQuantizeError">GetImageQuantizeError</a></h2>
379<div class="doc-section">
380
381<p>GetImageQuantizeError() measures the difference between the original and quantized images. This difference is the total quantization error. The error is computed by summing over all pixels in an image the distance squared in RGB space between each reference pixel value and its quantized value. These values are computed:</p>
382
383<pre class="text">
384 o mean_error_per_pixel: This value is the mean error for any single
385 pixel in the image.
386</pre>
387
388<h5>normalized_mean_square_error</h5>
389<p>This value is the normalized mean quantization error for any single pixel in the image. This distance measure is normalized to a range between 0 and 1. It is independent of the range of red, green, and blue values in the image.</p>
390
391<h5>normalized_maximum_square_error</h5>
392<p>Thsi value is the normalized maximum quantization error for any single pixel in the image. This distance measure is normalized to a range between 0 and 1. It is independent of the range of red, green, and blue values in your image.</p>
393
394<p>The format of the GetImageQuantizeError method is:</p>
395
396<pre class="code">
397 MagickBooleanType GetImageQuantizeError(Image *image)
398</pre>
399
400<p>A description of each parameter follows.</p>
401
402<h5>image</h5>
403<p>the image.</p>
404
405 </div>
406<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="GetQuantizeInfo">GetQuantizeInfo</a></h2>
407<div class="doc-section">
408
409<p>GetQuantizeInfo() initializes the QuantizeInfo structure.</p>
410
411<p>The format of the GetQuantizeInfo method is:</p>
412
413<pre class="code">
414 GetQuantizeInfo(QuantizeInfo *quantize_info)
415</pre>
416
417<p>A description of each parameter follows:</p>
418
419<h5>quantize_info</h5>
420<p>Specifies a pointer to a QuantizeInfo structure.</p>
421
422 </div>
423<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="PosterizeImage">PosterizeImage</a></h2>
424<div class="doc-section">
425
426<p>PosterizeImage() reduces the image to a limited number of colors for a "poster" effect.</p>
427
428<p>The format of the PosterizeImage method is:</p>
429
430<pre class="code">
431 MagickBooleanType PosterizeImage(Image *image,const size_t levels,
432 const MagickBooleanType dither)
433 MagickBooleanType PosterizeImageChannel(Image *image,
434 const ChannelType channel,const size_t levels,
435 const MagickBooleanType dither)
436</pre>
437
438<p>A description of each parameter follows:</p>
439
440<h5>image</h5>
441<p>Specifies a pointer to an Image structure.</p>
442
443<h5>levels</h5>
444<p>Number of color levels allowed in each channel. Very low values (2, 3, or 4) have the most visible effect.</p>
445
446<h5>dither</h5>
447<p>Set this integer value to something other than zero to dither the mapped image.</p>
448
449 </div>
450<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="QuantizeImage">QuantizeImage</a></h2>
451<div class="doc-section">
452
453<p>QuantizeImage() analyzes the colors within a reference image and chooses a fixed number of colors to represent the image. The goal of the algorithm is to minimize the color difference between the input and output image while minimizing the processing time.</p>
454
455<p>The format of the QuantizeImage method is:</p>
456
457<pre class="code">
458 MagickBooleanType QuantizeImage(const QuantizeInfo *quantize_info,
459 Image *image)
460</pre>
461
462<p>A description of each parameter follows:</p>
463
464<h5>quantize_info</h5>
465<p>Specifies a pointer to an QuantizeInfo structure.</p>
466
467<h5>image</h5>
468<p>the image.</p>
469
470 </div>
471<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="QuantizeImages">QuantizeImages</a></h2>
472<div class="doc-section">
473
474<p>QuantizeImages() analyzes the colors within a set of reference images and chooses a fixed number of colors to represent the set. The goal of the algorithm is to minimize the color difference between the input and output images while minimizing the processing time.</p>
475
476<p>The format of the QuantizeImages method is:</p>
477
478<pre class="code">
479 MagickBooleanType QuantizeImages(const QuantizeInfo *quantize_info,
480 Image *images)
481</pre>
482
483<p>A description of each parameter follows:</p>
484
485<h5>quantize_info</h5>
486<p>Specifies a pointer to an QuantizeInfo structure.</p>
487
488<h5>images</h5>
489<p>Specifies a pointer to a list of Image structures.</p>
490
491 </div>
492<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="RemapImage">RemapImage</a></h2>
493<div class="doc-section">
494
495<p>RemapImage() replaces the colors of an image with the closest color from a reference image.</p>
496
497<p>The format of the RemapImage method is:</p>
498
499<pre class="code">
500 MagickBooleanType RemapImage(const QuantizeInfo *quantize_info,
501 Image *image,const Image *remap_image)
502</pre>
503
504<p>A description of each parameter follows:</p>
505
506<h5>quantize_info</h5>
507<p>Specifies a pointer to an QuantizeInfo structure.</p>
508
509<h5>image</h5>
510<p>the image.</p>
511
512<h5>remap_image</h5>
513<p>the reference image.</p>
514
515 </div>
516<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="RemapImages">RemapImages</a></h2>
517<div class="doc-section">
518
519<p>RemapImages() replaces the colors of a sequence of images with the closest color from a reference image.</p>
520
521<p>The format of the RemapImage method is:</p>
522
523<pre class="code">
524 MagickBooleanType RemapImages(const QuantizeInfo *quantize_info,
525 Image *images,Image *remap_image)
526</pre>
527
528<p>A description of each parameter follows:</p>
529
530<h5>quantize_info</h5>
531<p>Specifies a pointer to an QuantizeInfo structure.</p>
532
533<h5>images</h5>
534<p>the image sequence.</p>
535
536<h5>remap_image</h5>
537<p>the reference image.</p>
538
539 </div>
540<h2><a href="http://www.imagemagick.org/api/MagickCore/quantize_8c.html" id="SetGrayscaleImage">SetGrayscaleImage</a></h2>
541<div class="doc-section">
542
543<p>SetGrayscaleImage() converts an image to a PseudoClass grayscale image.</p>
544
545<p>The format of the SetGrayscaleImage method is:</p>
546
547<pre class="code">
548 MagickBooleanType SetGrayscaleImage(Image *image)
549</pre>
550
551<p>A description of each parameter follows:</p>
552
553<h5>image</h5>
554<p>The image.</p>
555
556 </div>
cristy3eaa0ef2010-03-06 20:35:26 +0000557
558</div>
559
560<div id="linkbar">
cristyce69bb02010-07-27 19:49:46 +0000561 <span id="linkbar-west">&nbsp;</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000562 <span id="linkbar-center">
563 <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> &bull;
cristya8902942010-07-30 00:49:52 +0000564 <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
cristy3eaa0ef2010-03-06 20:35:26 +0000565 </span>
566 <span id="linkbar-east">&nbsp;</span>
567 </div>
568 <div class="footer">
cristyeed6cb62012-01-28 19:38:34 +0000569 <span id="footer-west">&copy; 1999-2011 ImageMagick Studio LLC</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000570 <span id="footer-east"> <a href="../http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>
571 </div>
572 <div style="clear: both; margin: 0; width: 100%; "></div>
cristya8902942010-07-30 00:49:52 +0000573 <script type="text/javascript">
574 var _gaq = _gaq || [];
575 _gaq.push(['_setAccount', 'UA-17690367-1']);
576 _gaq.push(['_trackPageview']);
577
578 (function() {
579 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
580 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
581 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
582 })();
583 </script>
cristy3eaa0ef2010-03-06 20:35:26 +0000584</body>
585</html>