Index: wp-includes/media.php
===================================================================
--- wp-includes/media.php	(revision 13615)
+++ wp-includes/media.php	(working copy)
@@ -275,10 +275,10 @@
  * @param int $orig_h Original height.
  * @param int $dest_w New width.
  * @param int $dest_h New height.
- * @param bool $crop Optional, default is false. Whether to crop image or resize.
- * @return bool|array False, on failure. Returned array matches parameters for imagecopyresampled() PHP function.
+ * @param bool $force Optional, default is false. Forces the generation of a new image, even if the original image is the same size or smaller.
+ * @return bool|array False, if no image was created. Returned array matches parameters for imagecopyresampled() PHP function.
  */
-function image_resize_dimensions($orig_w, $orig_h, $dest_w, $dest_h, $crop = false) {
+function image_resize_dimensions($orig_w, $orig_h, $dest_w, $dest_h, $crop = false, $force = false) {
 
 	if ($orig_w <= 0 || $orig_h <= 0)
 		return false;
@@ -318,8 +318,9 @@
 		list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h );
 	}
 
-	// if the resulting image would be the same size or larger we don't want to resize it
-	if ( $new_w >= $orig_w && $new_h >= $orig_h )
+	// if the resulting image would be the same size or larger, we don't want to
+	// resize it unless $force has been set
+	if ( $force == false && $new_w >= $orig_w && $new_h >= $orig_h )
 		return false;
 
 	// the return array matches the parameters to imagecopyresampled()
@@ -348,9 +349,10 @@
  * @param string $suffix Optional. File Suffix.
  * @param string $dest_path Optional. New image file path.
  * @param int $jpeg_quality Optional, default is 90. Image quality percentage.
- * @return mixed WP_Error on failure. String with new destination path. Array of dimensions from {@link image_resize_dimensions()}
+ * @param bool $force Optional, default is false. Forces the generation of a new image, even if the original image is the same size or smaller.
+ * @return mixed WP_Error on failure. False, if no image was created. String with new destination path. Array of dimensions from {@link image_resize_dimensions()}
  */
-function image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 ) {
+function image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90, $force = false ) {
 
 	$image = wp_load_image( $file );
 	if ( !is_resource( $image ) )
@@ -361,7 +363,7 @@
 		return new WP_Error('invalid_image', __('Could not read image size'), $file);
 	list($orig_w, $orig_h, $orig_type) = $size;
 
-	$dims = image_resize_dimensions($orig_w, $orig_h, $max_w, $max_h, $crop);
+	$dims = image_resize_dimensions($orig_w, $orig_h, $max_w, $max_h, $crop, $force);
 	if ( !$dims )
 		return $dims;
 	list($dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) = $dims;
@@ -425,11 +427,12 @@
  * @param int $width Image width.
  * @param int $height Image height.
  * @param bool $crop Optional, default is false. Whether to crop image to specified height and width or resize.
+ * @param bool $force Optional, default is false. Forces the generation of a new image, even if the original image is the same size or smaller.
  * @return bool|array False, if no image was created. Metadata array on success.
  */
-function image_make_intermediate_size($file, $width, $height, $crop=false) {
+function image_make_intermediate_size($file, $width, $height, $crop = false, $force = false) {
 	if ( $width || $height ) {
-		$resized_file = image_resize($file, $width, $height, $crop);
+		$resized_file = image_resize($file, $width, $height, $crop, null, null, 90, $force);
 		if ( !is_wp_error($resized_file) && $resized_file && $info = getimagesize($resized_file) ) {
 			$resized_file = apply_filters('image_make_intermediate_size', $resized_file);
 			return array(
Index: wp-admin/includes/image-edit.php
===================================================================
--- wp-admin/includes/image-edit.php	(revision 13615)
+++ wp-admin/includes/image-edit.php	(working copy)
@@ -630,7 +630,8 @@
 			}
 
 			$crop = $nocrop ? false : get_option("{$size}_crop");
-			$resized = image_make_intermediate_size($new_path, get_option("{$size}_size_w"), get_option("{$size}_size_h"), $crop );
+			$force = apply_filters('force_image_resize', false, $size);
+			$resized = image_make_intermediate_size($new_path, get_option("{$size}_size_w"), get_option("{$size}_size_h"), $crop, $force );
 
 			if ( $resized )
 				$meta['sizes'][$size] = $resized;
Index: wp-admin/includes/image.php
===================================================================
--- wp-admin/includes/image.php	(revision 13615)
+++ wp-admin/includes/image.php	(working copy)
@@ -122,7 +122,8 @@
 		$sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes );
 
 		foreach ($sizes as $size => $size_data ) {
-			$resized = image_make_intermediate_size( $file, $size_data['width'], $size_data['height'], $size_data['crop'] );
+			$force = apply_filters('force_image_resize', false, $size);
+			$resized = image_make_intermediate_size( $file, $size_data['width'], $size_data['height'], $size_data['crop'], $force );
 			if ( $resized )
 				$metadata['sizes'][$size] = $resized;
 		}
