diff --git src/wp-admin/includes/image.php src/wp-admin/includes/image.php
index b3b68560b4..c32dcec49c 100644
--- src/wp-admin/includes/image.php
+++ src/wp-admin/includes/image.php
@@ -249,6 +249,19 @@ function wp_create_image_subsizes( $file, $attachment_id ) {
 	// Do not scale (large) PNG images. May result in sub-sizes that have greater file size than the original. See #48736.
 	if ( 'image/png' !== $imagesize['mime'] ) {
 
+		$threshold = 2560;
+
+		// If there are registered image sizes with a value greater than the default threshold,
+		// use that value instead of the default. See https://core.trac.wordpress.org/ticket/48489.
+		foreach ( wp_get_registered_image_subsizes() as $subsize ) {
+			if ( $subsize['width'] > $threshold ) {
+				$threshold = $subsize['width'];
+			}
+			if ( $subsize['height'] > $threshold ) {
+				$threshold = $subsize['height'];
+			}
+		}
+
 		/**
 		 * Filters the "BIG image" threshold value.
 		 *
@@ -260,7 +273,7 @@ function wp_create_image_subsizes( $file, $attachment_id ) {
 		 *
 		 * @since 5.3.0
 		 *
-		 * @param int    $threshold     The threshold value in pixels. Default 2560.
+		 * @param int    $threshold     The threshold value in pixels. Default 2560 or the maximum registered image size.
 		 * @param array  $imagesize     {
 		 *     Indexed array of the image width and height in pixels.
 		 *
@@ -270,7 +283,7 @@ function wp_create_image_subsizes( $file, $attachment_id ) {
 		 * @param string $file          Full path to the uploaded image file.
 		 * @param int    $attachment_id Attachment post ID.
 		 */
-		$threshold = (int) apply_filters( 'big_image_size_threshold', 2560, $imagesize, $file, $attachment_id );
+		$threshold = (int) apply_filters( 'big_image_size_threshold', $threshold, $imagesize, $file, $attachment_id );
 
 		// If the original image's dimensions are over the threshold,
 		// scale the image and use it as the "full" size.
