diff --git a/coloractions/imagecache_coloractions.module b/coloractions/imagecache_coloractions.module
index 3a9297b..90e0a3e 100755
--- a/coloractions/imagecache_coloractions.module
+++ b/coloractions/imagecache_coloractions.module
@@ -89,6 +89,15 @@ function imagecache_coloractions_image_effect_info() {
     'summary theme' => 'coloractions_alpha_summary',
   );
 
+  $effects['coloractions_posterize'] = array(
+    'label' => t('Posterize'),
+    'help' => t('Reduce number of colors in image.'),
+    'effect callback' => 'coloractions_posterize_image',
+    'dimensions passthrough' => TRUE,
+    'form callback' => 'coloractions_posterize_form',
+    'summary theme' => 'coloractions_posterize_summary',
+  );
+  
   return $effects;
 }
 
@@ -112,6 +121,9 @@ function imagecache_coloractions_theme() {
     'coloractions_convert_summary' => array(
       'variables' => array('data' => NULL),
     ),
+    'coloractions_posterize_summary' => array(
+      'variables' => array('data' => NULL),
+    ),
   );
 }
 
@@ -497,3 +509,72 @@ function coloractions_file_formats() {
   return array('image/jpeg' => 'jpg', 'image/gif' => 'gif', 'image/png' => 'png');
 }
 
+/**
+ * Implementation of theme_hook() for imagecache_ui.module
+ */
+function theme_coloractions_posterize_summary($variables) {
+  return t(': Reduce to @colors colors @withDithering', array('@colors' => $variables['data']['colors'], '@with' => $variables['data']['dither'] ? '+' : '-'));
+}
+
+function coloractions_posterize_image(&$image, $data) {
+  if (!image_toolkit_invoke('posterize', $image, array($data['colors'], $data['dither']))) {
+    watchdog('image_posterize', 'Image posterize failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array(
+      '%toolkit' => $image->toolkit,
+      '%path' => $image->source,
+      '%mimetype' => $image->info['mime_type'],
+      '%dimensions' => $image->info['height'] . 'x' . $image->info['height'],
+    ), WATCHDOG_ERROR);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+function coloractions_posterize_form($data) {
+  $form = array();
+  
+  $form['colors'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Colors'),
+    '#default_value' => isset($data['colors']) ? $data['colors'] : '',
+    '#required' => TRUE,
+    '#size' => 10,
+    '#element_validate' => array('image_effect_integer_validate'),
+    '#allow_negative' => FALSE,
+    '#description' => t('Number of unique colors to reduce this image to.'),
+  );
+  
+  $form['dither'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Dither'),
+    '#default_value' => isset($data['dither']) ? $data['dither'] : FALSE,
+    '#return_value' => TRUE,
+    '#description' => t('This will give the illusion of smoother color graduations. It is not recommended if you are using this effect for file size reduction.'),
+  );
+  
+  return $form;
+}
+
+/**
+ * 
+ * @see http://php.net/manual/en/function.imagetruecolortopalette.php#44803
+ */
+function image_gd_posterize(stdClass $image, $colors, $dither = FALSE) {
+  
+  $width = $image->info['width'];
+  $height = $image->info['height'];
+  
+  $colors_handle = image_gd_create_tmp($image, $width, $height);
+  imagecopymerge($colors_handle, $image->resource, 0, 0, 0, 0, $width, $height, 100);
+  imagetruecolortopalette($image->resource, $dither, $colors);
+  imagecolormatch($colors_handle, $image->resource);
+  imagedestroy($colors_handle);
+  
+  return TRUE;
+}
+
+function image_imagemagick_posterize(stdClass $image, $colors, $dither = FALSE) {
+  
+  // Dithering is on by default, so +dither disables dithering in ImageMagick.
+  $image->ops[] = (!$dither ? '+dither ' : '') . '-posterize ' . (int) $colors;
+  return TRUE;
+}
