diff --git a/src/wp-includes/class-wp-image-editor-imagick.php b/src/wp-includes/class-wp-image-editor-imagick.php index f413387233..ee12b401d9 100644 --- a/src/wp-includes/class-wp-image-editor-imagick.php +++ b/src/wp-includes/class-wp-image-editor-imagick.php @@ -503,6 +503,10 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor { $size_data['crop'] = false; } + if ( ( $this->size['width'] == $size_data['width'] ) && ( $this->size['height'] == $size_data['height'] ) ) { + return new WP_Error( 'image_subsize_create_error', __( 'The image already has the requested size.' ) ); + } + $resized = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] ); if ( is_wp_error( $resized ) ) { diff --git a/tests/phpunit/tests/media.php b/tests/phpunit/tests/media.php index 994b4b7c72..fb93d781c3 100644 --- a/tests/phpunit/tests/media.php +++ b/tests/phpunit/tests/media.php @@ -3770,6 +3770,40 @@ EOF; } } + /** + * Test that an image size isn't generated if it matches the original image size. + */ + public function test_wp_generate_attachment_metadata_doesnt_generate_sizes_for_150_square_image() { + $temp_dir = get_temp_dir(); + $file = $temp_dir . '/test-square-150.jpg'; + copy( DIR_TESTDATA . '/images/test-square-150.jpg', $file ); + + $attachment_id = self::factory()->attachment->create_object( + array( + 'post_mime_type' => 'image/jpeg', + 'file' => $file, + ) + ); + + $metadata = wp_generate_attachment_metadata( $attachment_id, $file ); + $this->assertEquals( + array(), + $metadata['sizes'] + ); + $this->assertEquals( + 'test-square-150.jpg', + basename( $metadata['file'] ) + ); + $this->assertEquals( + '150', + $metadata['width'] + ); + $this->assertEquals( + '150', + $metadata['height'] + ); + } + /** * Add threshold to create a `-scaled` output image for testing. */