mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-06-28 22:30:04 +00:00
Media/Upload: rotate images on upload according to EXIF Orientation.
Props msaggiorato, wpdavis, markoheijnen, dhuyvetter, msaggiorato, n7studios, triplejumper12, pbiron, mikeschroder, joemcgill, azaozz. Fixes #14459. git-svn-id: https://develop.svn.wordpress.org/trunk@46202 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -384,6 +384,84 @@ abstract class WP_Image_Editor {
|
||||
return "{$this->size['width']}x{$this->size['height']}";
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a JPEG image has EXIF Orientation tag and rotate it if needed.
|
||||
*
|
||||
* @since 5.3.0
|
||||
*
|
||||
* @return bool|WP_Error True if the image was rotated. False if not rotated (no EXIF data or the image doesn't need to be rotated).
|
||||
* WP_Error if error while rotating.
|
||||
*/
|
||||
public function maybe_exif_rotate() {
|
||||
$orientation = null;
|
||||
|
||||
if ( is_callable( 'exif_read_data' ) && 'image/jpeg' === $this->mime_type ) {
|
||||
$exif_data = @exif_read_data( $this->file );
|
||||
|
||||
if ( ! empty( $exif_data['Orientation'] ) ) {
|
||||
$orientation = (int) $exif_data['Orientation'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the `$orientation` value to correct it before rotating or to prevemnt rotating the image.
|
||||
*
|
||||
* @since 5.3.0
|
||||
*
|
||||
* @param int $orientation EXIF Orientation value as retrieved from the image file.
|
||||
* @param string $file Path to the image file.
|
||||
*/
|
||||
$orientation = apply_filters( 'wp_image_maybe_exif_rotate', $orientation, $this->file );
|
||||
|
||||
if ( ! $orientation || $orientation === 1 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch ( $orientation ) {
|
||||
case 2:
|
||||
// Flip horizontally.
|
||||
$result = $this->flip( true, false );
|
||||
break;
|
||||
case 3:
|
||||
// Rotate 180 degrees or flip horizontally and vertically.
|
||||
// Flipping seems faster/uses less resources.
|
||||
$result = $this->flip( true, true );
|
||||
break;
|
||||
case 4:
|
||||
// Flip vertically.
|
||||
$result = $this->flip( false, true );
|
||||
break;
|
||||
case 5:
|
||||
// Rotate 90 degrees counter-clockwise and flip vertically.
|
||||
$result = $this->rotate( 90 );
|
||||
|
||||
if ( ! is_wp_error( $result ) ) {
|
||||
$result = $this->flip( false, true );
|
||||
}
|
||||
|
||||
break;
|
||||
case 6:
|
||||
// Rotate 90 degrees clockwise (270 counter-clockwise).
|
||||
$result = $this->rotate( 270 );
|
||||
break;
|
||||
case 7:
|
||||
// Rotate 90 degrees counter-clockwise and flip horizontally.
|
||||
$result = $this->rotate( 90 );
|
||||
|
||||
if ( ! is_wp_error( $result ) ) {
|
||||
$result = $this->flip( true, false );
|
||||
}
|
||||
|
||||
break;
|
||||
case 8:
|
||||
// Rotate 90 degrees counter-clockwise.
|
||||
$result = $this->rotate( 90 );
|
||||
break;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Either calls editor's save function or handles file as a stream.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user