WordPress.org

Make WordPress Core


Ignore:
Timestamp:
07/18/2016 02:13:45 AM (4 years ago)
Author:
joemcgill
Message:

Media: Prevent image_get_intermediate_size() from returning cropped images.

When $size is passed to image_get_intermediate_size() as an array of width
and height values and an exact image size matching those values isn't available,
the function loops through the available attachment sizes and returns the
smallest image larger than the requested dimensions with the same aspect ratio.

The aspect ratio check is skipped for the 'thumbnail' size to provide a fallback
for small sizes when no other image option is available. This resulted in a poor
selection when the size requested was smaller than the 'thumbnail' dimensions
but a larger size matching the requested ratio existed.

This refactors the internals of image_get_intermediate_size() to ensure the
'thumbnail' size is only returned as a fallback to small sizes once all other
options have been considered, and makes the control flow easier to follow.

This also introduces a new helper function, wp_image_matches_ratio() for
testing whether the aspect ratios of two sets of dimensions match. This function
is also now used in wp_calculate_image_srcset() during the selection process.

Props flixos, joemcgill.
Fixes #34384, #34980.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/image/intermediate_size.php

    r37328 r38086  
    225225        $this->assertTrue( strpos( $image['file'], $width . 'x' . $height ) > 0 );
    226226    }
     227
     228    /**
     229     * @ticket 34384
     230     */
     231    public function test_get_intermediate_size_with_small_size_array() {
     232        // Add a hard cropped size that matches the aspect ratio we're going to test.
     233        add_image_size( 'test-size', 200, 100, true );
     234
     235        $file = DIR_TESTDATA . '/images/waffles.jpg';
     236        $id = $this->_make_attachment( $file, 0 );
     237
     238        // Request a size by array that doesn't exist and is smaller than the 'thumbnail'
     239        $image = image_get_intermediate_size( $id, array( 50, 25 ) );
     240
     241        // We should get the 'test-size' file and not the thumbnail.
     242        $this->assertTrue( strpos( $image['file'], '200x100' ) > 0 );
     243    }
     244
     245    /**
     246     * @ticket 34384
     247     */
     248    public function test_get_intermediate_size_with_small_size_array_fallback() {
     249        $file = DIR_TESTDATA . '/images/waffles.jpg';
     250        $id = $this->_make_attachment( $file, 0 );
     251
     252        $original = wp_get_attachment_metadata( $id );
     253        $thumbnail_file = $original['sizes']['thumbnail']['file'];
     254
     255        // Request a size by array that doesn't exist and is smaller than the 'thumbnail'
     256        $image = image_get_intermediate_size( $id, array( 50, 25 ) );
     257
     258        // We should get the 'thumbnail' file as a fallback.
     259        $this->assertSame( $image['file'], $thumbnail_file );
     260    }
    227261}
Note: See TracChangeset for help on using the changeset viewer.