Index: wp-includes/media.php
===================================================================
--- wp-includes/media.php	(revision 19471)
+++ wp-includes/media.php	(working copy)
@@ -179,10 +179,21 @@
  * Registers a new image size
  *
  * @since 2.9.0
+ * 
+ * In addition to true/false, the $crop parameter takes an array of the format
+ * array( x_crop_position, y_crop_position )
+ * x_crop_position can be 'left', 'center', 'right'
+ * y_crop_position can be 'top', 'center', 'bottom'
+ * 
+ * @param string $name Image size identifier.
+ * @param int $width Image width.
+ * @param int $height Image height.
+ * @param bool|array $crop Optional, default is false. Whether to crop image to specified height and width or resize. An array can specify positioning of the crop area.
+ * @return bool|array False, if no image was created. Metadata array on success.
  */
 function add_image_size( $name, $width = 0, $height = 0, $crop = false ) {
 	global $_wp_additional_image_sizes;
-	$_wp_additional_image_sizes[$name] = array( 'width' => absint( $width ), 'height' => absint( $height ), 'crop' => (bool) $crop );
+	$_wp_additional_image_sizes[$name] = array( 'width' => absint( $width ), 'height' => absint( $height ), 'crop' => $crop );
 }
 
 /**
@@ -362,8 +373,21 @@
 		$crop_w = round($new_w / $size_ratio);
 		$crop_h = round($new_h / $size_ratio);
 
-		$s_x = floor( ($orig_w - $crop_w) / 2 );
-		$s_y = floor( ($orig_h - $crop_h) / 2 );
+        if ( !is_array( $crop ) || count( $crop ) != 2 ) {
+			$crop = apply_filters( 'image_resize_crop_default', array( 'center', 'center' ) );
+		}
+		
+		switch ( $crop[0] ) {
+			case 'left': $s_x = 0; break;
+			case 'right': $s_x = $orig_w - $crop_w; break;
+			default: $s_x = floor( ( $orig_w - $crop_w ) / 2 );
+		}
+
+		switch ( $crop[1] ) {
+			case 'top': $s_y = 0; break;
+			case 'bottom': $s_y = $orig_h - $crop_h; break;
+			default: $s_y = floor( ( $orig_h - $crop_h ) / 2 );
+		}
 	} else {
 		// don't crop, just resize using $dest_w x $dest_h as a maximum bounding box
 		$crop_w = $orig_w;
Index: wp-admin/includes/image.php
===================================================================
--- wp-admin/includes/image.php	(revision 19471)
+++ wp-admin/includes/image.php	(working copy)
@@ -114,7 +114,7 @@
 			else
 				$sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
 			if ( isset( $_wp_additional_image_sizes[$s]['crop'] ) )
-				$sizes[$s]['crop'] = intval( $_wp_additional_image_sizes[$s]['crop'] ); // For theme-added sizes
+				$sizes[$s]['crop'] = $_wp_additional_image_sizes[$s]['crop']; // For theme-added sizes
 			else
 				$sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
 		}
