WordPress.org

Make WordPress Core

Changeset 40135


Ignore:
Timestamp:
02/27/2017 07:32:45 PM (15 months ago)
Author:
joemcgill
Message:

Media: Reset Exif orientation after rotate in WP_Image_Editor_Imagick.

Due to inconsistencies in the way browsers handle Exif orientation data,
if a user manually rotates an image within WordPress, set the Exif orientation to
the default (1) so that the image displays with the same rotation/flip in every browser.

Props sanchothefat, triplejumper12, joemcgill, azaozz, markoheijnen, mikeschroder.
Merges [40123] and [40129] to the 4.7 branch.
Fixes #37140. See #14459.

Location:
branches/4.7
Files:
3 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/4.7

  • branches/4.7/src/wp-includes/class-wp-image-editor-imagick.php

    r39607 r40135  
    550550            $this->image->rotateImage( new ImagickPixel('none'), 360-$angle );
    551551
     552            // Normalise Exif orientation data so that display is consistent across devices.
     553            if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) {
     554                $this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT );
     555            }
     556
    552557            // Since this changes the dimensions of the image, update the size.
    553558            $result = $this->update_size();
  • branches/4.7/tests/phpunit/tests/image/editor_imagick.php

    r39607 r40135  
    543543        $this->assertTrue( $result );
    544544    }
     545
     546    /**
     547     * Test resetting Exif orientation data on rotate
     548     *
     549     * @ticket 37140
     550     */
     551    public function test_remove_orientation_data_on_rotate() {
     552        $file = DIR_TESTDATA . "/images/test-image-upside-down.jpg";
     553        $data = wp_read_image_metadata( $file );
     554
     555        // The orientation value 3 is equivalent to rotated upside down (180 degrees).
     556        $this->assertEquals( 3, intval( $data['orientation'] ), 'Orientation value read from does not match image file Exif data: ' . $file );
     557
     558        $temp_file = wp_tempnam( $file );
     559        $image = wp_get_image_editor( $file );
     560
     561        // Test a value that would not lead back to 1, as WP is resetting the value to 1 manually.
     562        $image->rotate( 90 );
     563        $ret = $image->save( $temp_file, 'image/jpeg' );
     564
     565        $data = wp_read_image_metadata( $ret['path'] );
     566
     567        // Make sure the image is no longer in The Upside Down Exif orientation.
     568        $this->assertEquals( 1, intval( $data['orientation'] ), 'Orientation Exif data was not updated after rotating image: ' . $file );
     569
     570        // Remove both the generated file ending in .tmp and tmp.jpg due to wp_tempnam().
     571        unlink( $temp_file );
     572        unlink( $ret['path'] );
     573    }
     574
    545575}
Note: See TracChangeset for help on using the changeset viewer.