X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/699231ae09f7057a4d0000cdf32e50a3df6a04ca..febc815b2c9d85be5717da9e8d164bd2daa97e31:/wp-admin/includes/image-edit.php?ds=sidebyside
diff --git a/wp-admin/includes/image-edit.php b/wp-admin/includes/image-edit.php
index e871ae5e..928cd135 100644
--- a/wp-admin/includes/image-edit.php
+++ b/wp-admin/includes/image-edit.php
@@ -6,6 +6,13 @@
* @subpackage Administration
*/
+/**
+ * Loads the WP image-editing interface.
+ *
+ * @param int $post_id Post ID.
+ * @param bool|object $msg Optional. Message to display for image editor updates or errors.
+ * Default false.
+ */
function wp_image_editor($post_id, $msg = false) {
$nonce = wp_create_nonce("image_editor-$post_id");
$meta = wp_get_attachment_metadata($post_id);
@@ -13,7 +20,7 @@ function wp_image_editor($post_id, $msg = false) {
$sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
$note = '';
- if ( is_array($meta) && isset($meta['width']) )
+ if ( isset( $meta['width'], $meta['height'] ) )
$big = max( $meta['width'], $meta['height'] );
else
die( __('Image data does not exist. Please re-upload the image.') );
@@ -21,8 +28,9 @@ function wp_image_editor($post_id, $msg = false) {
$sizer = $big > 400 ? 400 / $big : 1;
$backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
- $can_restore = !empty($backup_sizes) && isset($backup_sizes['full-orig'])
- && $backup_sizes['full-orig']['file'] != basename($meta['file']);
+ $can_restore = false;
+ if ( ! empty( $backup_sizes ) && isset( $backup_sizes['full-orig'], $meta['file'] ) )
+ $can_restore = $backup_sizes['full-orig']['file'] != basename( $meta['file'] );
if ( $msg ) {
if ( isset($msg->error) )
@@ -32,69 +40,46 @@ function wp_image_editor($post_id, $msg = false) {
}
?>
-
-
-
-
- |
-
-
+
-
-
-
-
+
-
-
+
+
+
- |
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )" disabled="disabled" class="button button-primary imgedit-submit-btn" value="" />
+
+
+
+
+
+
+
+stream( $mime_type ) ) )
return false;
+
+ return true;
+ } else {
+ _deprecated_argument( __FUNCTION__, '3.5.0', __( '$image needs to be an WP_Image_Editor object' ) );
+
+ /**
+ * Filters the GD image resource to be streamed to the browser.
+ *
+ * @since 2.9.0
+ * @deprecated 3.5.0 Use image_editor_save_pre instead.
+ *
+ * @param resource $image Image resource to be streamed.
+ * @param int $post_id Post ID.
+ */
+ $image = apply_filters( 'image_save_pre', $image, $post_id );
+
+ switch ( $mime_type ) {
+ case 'image/jpeg':
+ header( 'Content-Type: image/jpeg' );
+ return imagejpeg( $image, null, 90 );
+ case 'image/png':
+ header( 'Content-Type: image/png' );
+ return imagepng( $image );
+ case 'image/gif':
+ header( 'Content-Type: image/gif' );
+ return imagegif( $image );
+ default:
+ return false;
+ }
}
}
-function wp_save_image_file($filename, $image, $mime_type, $post_id) {
- $image = apply_filters('image_save_pre', $image, $post_id);
- $saved = apply_filters('wp_save_image_file', null, $filename, $image, $mime_type, $post_id);
- if ( null !== $saved )
- return $saved;
-
- switch ( $mime_type ) {
- case 'image/jpeg':
- return imagejpeg( $image, $filename, apply_filters( 'jpeg_quality', 90, 'edit_image' ) );
- case 'image/png':
- return imagepng($image, $filename);
- case 'image/gif':
- return imagegif($image, $filename);
- default:
- return false;
+/**
+ * Saves Image to File
+ *
+ * @param string $filename
+ * @param WP_Image_Editor $image
+ * @param string $mime_type
+ * @param int $post_id
+ * @return bool
+ */
+function wp_save_image_file( $filename, $image, $mime_type, $post_id ) {
+ if ( $image instanceof WP_Image_Editor ) {
+
+ /** This filter is documented in wp-admin/includes/image-edit.php */
+ $image = apply_filters( 'image_editor_save_pre', $image, $post_id );
+
+ /**
+ * Filters whether to skip saving the image file.
+ *
+ * Returning a non-null value will short-circuit the save method,
+ * returning that value instead.
+ *
+ * @since 3.5.0
+ *
+ * @param mixed $override Value to return instead of saving. Default null.
+ * @param string $filename Name of the file to be saved.
+ * @param WP_Image_Editor $image WP_Image_Editor instance.
+ * @param string $mime_type Image mime type.
+ * @param int $post_id Post ID.
+ */
+ $saved = apply_filters( 'wp_save_image_editor_file', null, $filename, $image, $mime_type, $post_id );
+
+ if ( null !== $saved )
+ return $saved;
+
+ return $image->save( $filename, $mime_type );
+ } else {
+ _deprecated_argument( __FUNCTION__, '3.5.0', __( '$image needs to be an WP_Image_Editor object' ) );
+
+ /** This filter is documented in wp-admin/includes/image-edit.php */
+ $image = apply_filters( 'image_save_pre', $image, $post_id );
+
+ /**
+ * Filters whether to skip saving the image file.
+ *
+ * Returning a non-null value will short-circuit the save method,
+ * returning that value instead.
+ *
+ * @since 2.9.0
+ * @deprecated 3.5.0 Use wp_save_image_editor_file instead.
+ *
+ * @param mixed $override Value to return instead of saving. Default null.
+ * @param string $filename Name of the file to be saved.
+ * @param WP_Image_Editor $image WP_Image_Editor instance.
+ * @param string $mime_type Image mime type.
+ * @param int $post_id Post ID.
+ */
+ $saved = apply_filters( 'wp_save_image_file', null, $filename, $image, $mime_type, $post_id );
+
+ if ( null !== $saved )
+ return $saved;
+
+ switch ( $mime_type ) {
+ case 'image/jpeg':
+
+ /** This filter is documented in wp-includes/class-wp-image-editor.php */
+ return imagejpeg( $image, $filename, apply_filters( 'jpeg_quality', 90, 'edit_image' ) );
+ case 'image/png':
+ return imagepng( $image, $filename );
+ case 'image/gif':
+ return imagegif( $image, $filename );
+ default:
+ return false;
+ }
}
}
+/**
+ * Image preview ratio. Internal use only.
+ *
+ * @since 2.9.0
+ *
+ * @ignore
+ * @param int $w Image width in pixels.
+ * @param int $h Image height in pixels.
+ * @return float|int Image preview ratio.
+ */
function _image_get_preview_ratio($w, $h) {
$max = max($w, $h);
return $max > 400 ? (400 / $max) : 1;
}
+/**
+ * Returns an image resource. Internal use only.
+ *
+ * @since 2.9.0
+ *
+ * @ignore
+ * @param resource $img Image resource.
+ * @param float|int $angle Image rotation angle, in degrees.
+ * @return resource|false GD image resource, false otherwise.
+ */
function _rotate_image_resource($img, $angle) {
+ _deprecated_function( __FUNCTION__, '3.5.0', __( 'Use WP_Image_Editor::rotate' ) );
if ( function_exists('imagerotate') ) {
$rotated = imagerotate($img, $angle, 0);
if ( is_resource($rotated) ) {
@@ -287,8 +398,19 @@ function _rotate_image_resource($img, $angle) {
return $img;
}
-
+/**
+ * Flips an image resource. Internal use only.
+ *
+ * @since 2.9.0
+ *
+ * @ignore
+ * @param resource $img Image resource.
+ * @param bool $horz Whether to flip horizontally.
+ * @param bool $vert Whether to flip vertically.
+ * @return resource (maybe) flipped image resource.
+ */
function _flip_image_resource($img, $horz, $vert) {
+ _deprecated_function( __FUNCTION__, '3.5.0', __( 'Use WP_Image_Editor::flip' ) );
$w = imagesx($img);
$h = imagesy($img);
$dst = wp_imagecreatetruecolor($w, $h);
@@ -306,6 +428,19 @@ function _flip_image_resource($img, $horz, $vert) {
return $img;
}
+/**
+ * Crops an image resource. Internal use only.
+ *
+ * @since 2.9.0
+ *
+ * @ignore
+ * @param resource $img Image resource.
+ * @param float $x Source point x-coordinate.
+ * @param float $y Source point y-cooredinate.
+ * @param float $w Source width.
+ * @param float $h Source height.
+ * @return resource (maybe) cropped image resource.
+ */
function _crop_image_resource($img, $x, $y, $w, $h) {
$dst = wp_imagecreatetruecolor($w, $h);
if ( is_resource($dst) ) {
@@ -317,12 +452,23 @@ function _crop_image_resource($img, $x, $y, $w, $h) {
return $img;
}
-function image_edit_apply_changes($img, $changes) {
+/**
+ * Performs group of changes on Editor specified.
+ *
+ * @since 2.9.0
+ *
+ * @param WP_Image_Editor $image WP_Image_Editor instance.
+ * @param array $changes Array of change operations.
+ * @return WP_Image_Editor WP_Image_Editor instance with changes applied.
+ */
+function image_edit_apply_changes( $image, $changes ) {
+ if ( is_resource( $image ) )
+ _deprecated_argument( __FUNCTION__, '3.5.0', __( '$image needs to be an WP_Image_Editor object' ) );
if ( !is_array($changes) )
- return $img;
+ return $image;
- // expand change operations
+ // Expand change operations.
foreach ( $changes as $key => $obj ) {
if ( isset($obj->r) ) {
$obj->type = 'rotate';
@@ -340,10 +486,10 @@ function image_edit_apply_changes($img, $changes) {
$changes[$key] = $obj;
}
- // combine operations
+ // Combine operations.
if ( count($changes) > 1 ) {
$filtered = array($changes[0]);
- for ( $i = 0, $j = 1; $j < count($changes); $j++ ) {
+ for ( $i = 0, $j = 1, $c = count( $changes ); $j < $c; $j++ ) {
$combined = false;
if ( $filtered[$i]->type == $changes[$j]->type ) {
switch ( $filtered[$i]->type ) {
@@ -364,64 +510,122 @@ function image_edit_apply_changes($img, $changes) {
unset($filtered);
}
- // image resource before applying the changes
- $img = apply_filters('image_edit_before_change', $img, $changes);
+ // Image resource before applying the changes.
+ if ( $image instanceof WP_Image_Editor ) {
+
+ /**
+ * Filters the WP_Image_Editor instance before applying changes to the image.
+ *
+ * @since 3.5.0
+ *
+ * @param WP_Image_Editor $image WP_Image_Editor instance.
+ * @param array $changes Array of change operations.
+ */
+ $image = apply_filters( 'wp_image_editor_before_change', $image, $changes );
+ } elseif ( is_resource( $image ) ) {
+
+ /**
+ * Filters the GD image resource before applying changes to the image.
+ *
+ * @since 2.9.0
+ * @deprecated 3.5.0 Use wp_image_editor_before_change instead.
+ *
+ * @param resource $image GD image resource.
+ * @param array $changes Array of change operations.
+ */
+ $image = apply_filters( 'image_edit_before_change', $image, $changes );
+ }
foreach ( $changes as $operation ) {
switch ( $operation->type ) {
case 'rotate':
- if ( $operation->angle != 0 )
- $img = _rotate_image_resource($img, $operation->angle);
+ if ( $operation->angle != 0 ) {
+ if ( $image instanceof WP_Image_Editor )
+ $image->rotate( $operation->angle );
+ else
+ $image = _rotate_image_resource( $image, $operation->angle );
+ }
break;
case 'flip':
if ( $operation->axis != 0 )
- $img = _flip_image_resource($img, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
+ if ( $image instanceof WP_Image_Editor )
+ $image->flip( ($operation->axis & 1) != 0, ($operation->axis & 2) != 0 );
+ else
+ $image = _flip_image_resource( $image, ( $operation->axis & 1 ) != 0, ( $operation->axis & 2 ) != 0 );
break;
case 'crop':
$sel = $operation->sel;
- $scale = 1 / _image_get_preview_ratio( imagesx($img), imagesy($img) ); // discard preview scaling
- $img = _crop_image_resource($img, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
+
+ if ( $image instanceof WP_Image_Editor ) {
+ $size = $image->get_size();
+ $w = $size['width'];
+ $h = $size['height'];
+
+ $scale = 1 / _image_get_preview_ratio( $w, $h ); // discard preview scaling
+ $image->crop( $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale );
+ } else {
+ $scale = 1 / _image_get_preview_ratio( imagesx( $image ), imagesy( $image ) ); // discard preview scaling
+ $image = _crop_image_resource( $image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale );
+ }
break;
}
}
- return $img;
+ return $image;
}
-function stream_preview_image($post_id) {
- $post = get_post($post_id);
- @ini_set('memory_limit', '256M');
- $img = load_image_to_edit( $post_id, $post->post_mime_type, array(400, 400) );
- if ( !is_resource($img) )
+/**
+ * Streams image in post to browser, along with enqueued changes
+ * in $_REQUEST['history']
+ *
+ * @param int $post_id
+ * @return bool
+ */
+function stream_preview_image( $post_id ) {
+ $post = get_post( $post_id );
+
+ wp_raise_memory_limit( 'admin' );
+
+ $img = wp_get_image_editor( _load_image_to_edit_path( $post_id ) );
+
+ if ( is_wp_error( $img ) ) {
return false;
+ }
- $changes = !empty($_REQUEST['history']) ? json_decode( stripslashes($_REQUEST['history']) ) : null;
+ $changes = !empty($_REQUEST['history']) ? json_decode( wp_unslash($_REQUEST['history']) ) : null;
if ( $changes )
- $img = image_edit_apply_changes($img, $changes);
+ $img = image_edit_apply_changes( $img, $changes );
- // scale the image
- $w = imagesx($img);
- $h = imagesy($img);
- $ratio = _image_get_preview_ratio($w, $h);
- $w2 = $w * $ratio;
- $h2 = $h * $ratio;
+ // Scale the image.
+ $size = $img->get_size();
+ $w = $size['width'];
+ $h = $size['height'];
- $preview = wp_imagecreatetruecolor($w2, $h2);
- imagecopyresampled( $preview, $img, 0, 0, 0, 0, $w2, $h2, $w, $h );
- wp_stream_image($preview, $post->post_mime_type, $post_id);
+ $ratio = _image_get_preview_ratio( $w, $h );
+ $w2 = max ( 1, $w * $ratio );
+ $h2 = max ( 1, $h * $ratio );
- imagedestroy($preview);
- imagedestroy($img);
- return true;
+ if ( is_wp_error( $img->resize( $w2, $h2 ) ) )
+ return false;
+
+ return wp_stream_image( $img, $post->post_mime_type, $post_id );
}
+/**
+ * Restores the metadata for a given attachment.
+ *
+ * @since 2.9.0
+ *
+ * @param int $post_id Attachment post ID.
+ * @return stdClass Image restoration message object.
+ */
function wp_restore_image($post_id) {
$meta = wp_get_attachment_metadata($post_id);
$file = get_attached_file($post_id);
- $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
+ $backup_sizes = $old_backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
$restored = false;
- $msg = '';
+ $msg = new stdClass;
if ( !is_array($backup_sizes) ) {
$msg->error = __('Cannot load image metadata.');
@@ -430,19 +634,19 @@ function wp_restore_image($post_id) {
$parts = pathinfo($file);
$suffix = time() . rand(100, 999);
- $default_sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') );
+ $default_sizes = get_intermediate_image_sizes();
if ( isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig']) ) {
$data = $backup_sizes['full-orig'];
if ( $parts['basename'] != $data['file'] ) {
if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) {
- // delete only if it's edited image
+
+ // Delete only if it's an edited image.
if ( preg_match('/-e[0-9]{13}\./', $parts['basename']) ) {
- $delpath = apply_filters('wp_delete_file', $file);
- @unlink($delpath);
+ wp_delete_file( $file );
}
- } else {
+ } elseif ( isset( $meta['width'], $meta['height'] ) ) {
$backup_sizes["full-$suffix"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
}
}
@@ -453,8 +657,6 @@ function wp_restore_image($post_id) {
$meta['file'] = _wp_relative_upload_path( $restored_file );
$meta['width'] = $data['width'];
$meta['height'] = $data['height'];
- list ( $uwidth, $uheight ) = wp_constrain_dimensions($meta['width'], $meta['height'], 128, 96);
- $meta['hwstring_small'] = "height='$uheight' width='$uwidth'";
}
foreach ( $default_sizes as $default_size ) {
@@ -462,10 +664,11 @@ function wp_restore_image($post_id) {
$data = $backup_sizes["$default_size-orig"];
if ( isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file'] ) {
if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) {
- // delete only if it's edited image
+
+ // Delete only if it's an edited image.
if ( preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file']) ) {
- $delpath = apply_filters( 'wp_delete_file', path_join($parts['dirname'], $meta['sizes'][$default_size]['file']) );
- @unlink($delpath);
+ $delete_file = path_join( $parts['dirname'], $meta['sizes'][$default_size]['file'] );
+ wp_delete_file( $delete_file );
}
} else {
$backup_sizes["$default_size-{$suffix}"] = $meta['sizes'][$default_size];
@@ -478,7 +681,9 @@ function wp_restore_image($post_id) {
}
}
- if ( !wp_update_attachment_metadata($post_id, $meta) || !update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes) ) {
+ if ( ! wp_update_attachment_metadata( $post_id, $meta ) ||
+ ( $old_backup_sizes !== $backup_sizes && ! update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes ) ) ) {
+
$msg->error = __('Cannot save image metadata.');
return $msg;
}
@@ -491,14 +696,24 @@ function wp_restore_image($post_id) {
return $msg;
}
-function wp_save_image($post_id) {
- $return = '';
+/**
+ * Saves image to post along with enqueued changes
+ * in $_REQUEST['history']
+ *
+ * @global array $_wp_additional_image_sizes
+ *
+ * @param int $post_id
+ * @return \stdClass
+ */
+function wp_save_image( $post_id ) {
+ global $_wp_additional_image_sizes;
+
+ $return = new stdClass;
$success = $delete = $scaled = $nocrop = false;
- $post = get_post($post_id);
- @ini_set('memory_limit', '256M');
- $img = load_image_to_edit($post_id, $post->post_mime_type);
+ $post = get_post( $post_id );
- if ( !is_resource($img) ) {
+ $img = wp_get_image_editor( _load_image_to_edit_path( $post_id, 'full' ) );
+ if ( is_wp_error( $img ) ) {
$return->error = esc_js( __('Unable to create new image.') );
return $return;
}
@@ -509,19 +724,16 @@ function wp_save_image($post_id) {
$scale = !empty($_REQUEST['do']) && 'scale' == $_REQUEST['do'];
if ( $scale && $fwidth > 0 && $fheight > 0 ) {
- $sX = imagesx($img);
- $sY = imagesy($img);
+ $size = $img->get_size();
+ $sX = $size['width'];
+ $sY = $size['height'];
- // check if it has roughly the same w / h ratio
+ // Check if it has roughly the same w / h ratio.
$diff = round($sX / $sY, 2) - round($fwidth / $fheight, 2);
if ( -0.1 < $diff && $diff < 0.1 ) {
- // scale the full size image
- $dst = wp_imagecreatetruecolor($fwidth, $fheight);
- if ( imagecopyresampled( $dst, $img, 0, 0, 0, 0, $fwidth, $fheight, $sX, $sY ) ) {
- imagedestroy($img);
- $img = $dst;
+ // Scale the full size image.
+ if ( $img->resize( $fwidth, $fheight ) )
$scaled = true;
- }
}
if ( !$scaled ) {
@@ -529,7 +741,7 @@ function wp_save_image($post_id) {
return $return;
}
} elseif ( !empty($_REQUEST['history']) ) {
- $changes = json_decode( stripslashes($_REQUEST['history']) );
+ $changes = json_decode( wp_unslash($_REQUEST['history']) );
if ( $changes )
$img = image_edit_apply_changes($img, $changes);
} else {
@@ -548,9 +760,9 @@ function wp_save_image($post_id) {
if ( !is_array($backup_sizes) )
$backup_sizes = array();
- // generate new filename
+ // Generate new filename.
$path = get_attached_file($post_id);
- $path_parts = pathinfo52( $path );
+ $path_parts = pathinfo( $path );
$filename = $path_parts['filename'];
$suffix = time() . rand(100, 999);
@@ -574,7 +786,7 @@ function wp_save_image($post_id) {
}
}
- // save the full-size file, also needed to create sub-sizes
+ // Save the full-size file, also needed to create sub-sizes.
if ( !wp_save_image_file($new_path, $img, $post->post_mime_type, $post_id) ) {
$return->error = esc_js( __('Unable to save the image.') );
return $return;
@@ -592,17 +804,16 @@ function wp_save_image($post_id) {
if ( $tag )
$backup_sizes[$tag] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $path_parts['basename']);
- $success = update_attached_file($post_id, $new_path);
+ $success = ( $path === $new_path ) || update_attached_file( $post_id, $new_path );
- $meta['file'] = _wp_relative_upload_path($new_path);
- $meta['width'] = imagesx($img);
- $meta['height'] = imagesy($img);
+ $meta['file'] = _wp_relative_upload_path( $new_path );
- list ( $uwidth, $uheight ) = wp_constrain_dimensions($meta['width'], $meta['height'], 128, 96);
- $meta['hwstring_small'] = "height='$uheight' width='$uwidth'";
+ $size = $img->get_size();
+ $meta['width'] = $size['width'];
+ $meta['height'] = $size['height'];
if ( $success && ('nothumb' == $target || 'all' == $target) ) {
- $sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') );
+ $sizes = get_intermediate_image_sizes();
if ( 'nothumb' == $target )
$sizes = array_diff( $sizes, array('thumbnail') );
}
@@ -614,10 +825,27 @@ function wp_save_image($post_id) {
$success = $delete = $nocrop = true;
}
- if ( isset($sizes) ) {
+ /*
+ * We need to remove any existing resized image files because
+ * a new crop or rotate could generate different sizes (and hence, filenames),
+ * keeping the new resized images from overwriting the existing image files.
+ * https://core.trac.wordpress.org/ticket/32171
+ */
+ if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE && ! empty( $meta['sizes'] ) ) {
+ foreach ( $meta['sizes'] as $size ) {
+ if ( ! empty( $size['file'] ) && preg_match( '/-e[0-9]{13}-/', $size['file'] ) ) {
+ $delete_file = path_join( $path_parts['dirname'], $size['file'] );
+ wp_delete_file( $delete_file );
+ }
+ }
+ }
+
+ if ( isset( $sizes ) ) {
+ $_sizes = array();
+
foreach ( $sizes as $size ) {
$tag = false;
- if ( isset($meta['sizes'][$size]) ) {
+ if ( isset( $meta['sizes'][$size] ) ) {
if ( isset($backup_sizes["$size-orig"]) ) {
if ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes["$size-orig"]['file'] != $meta['sizes'][$size]['file'] )
$tag = "$size-$suffix";
@@ -629,39 +857,50 @@ function wp_save_image($post_id) {
$backup_sizes[$tag] = $meta['sizes'][$size];
}
- $crop = $nocrop ? false : get_option("{$size}_crop");
- $resized = image_make_intermediate_size($new_path, get_option("{$size}_size_w"), get_option("{$size}_size_h"), $crop );
+ if ( isset( $_wp_additional_image_sizes[ $size ] ) ) {
+ $width = intval( $_wp_additional_image_sizes[ $size ]['width'] );
+ $height = intval( $_wp_additional_image_sizes[ $size ]['height'] );
+ $crop = ( $nocrop ) ? false : $_wp_additional_image_sizes[ $size ]['crop'];
+ } else {
+ $height = get_option( "{$size}_size_h" );
+ $width = get_option( "{$size}_size_w" );
+ $crop = ( $nocrop ) ? false : get_option( "{$size}_crop" );
+ }
- if ( $resized )
- $meta['sizes'][$size] = $resized;
- else
- unset($meta['sizes'][$size]);
+ $_sizes[ $size ] = array( 'width' => $width, 'height' => $height, 'crop' => $crop );
}
+
+ $meta['sizes'] = array_merge( $meta['sizes'], $img->multi_resize( $_sizes ) );
}
+ unset( $img );
+
if ( $success ) {
- wp_update_attachment_metadata($post_id, $meta);
+ wp_update_attachment_metadata( $post_id, $meta );
update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes);
if ( $target == 'thumbnail' || $target == 'all' || $target == 'full' ) {
- $file_url = wp_get_attachment_url($post_id);
- if ( $thumb = $meta['sizes']['thumbnail'] )
- $return->thumbnail = path_join( dirname($file_url), $thumb['file'] );
- else
- $return->thumbnail = "$file_url?w=128&h=128";
+ // Check if it's an image edit from attachment edit screen
+ if ( ! empty( $_REQUEST['context'] ) && 'edit-attachment' == $_REQUEST['context'] ) {
+ $thumb_url = wp_get_attachment_image_src( $post_id, array( 900, 600 ), true );
+ $return->thumbnail = $thumb_url[0];
+ } else {
+ $file_url = wp_get_attachment_url($post_id);
+ if ( ! empty( $meta['sizes']['thumbnail'] ) && $thumb = $meta['sizes']['thumbnail'] ) {
+ $return->thumbnail = path_join( dirname($file_url), $thumb['file'] );
+ } else {
+ $return->thumbnail = "$file_url?w=128&h=128";
+ }
+ }
}
} else {
$delete = true;
}
if ( $delete ) {
- $delpath = apply_filters('wp_delete_file', $new_path);
- @unlink($delpath);
+ wp_delete_file( $new_path );
}
- imagedestroy($img);
-
$return->msg = esc_js( __('Image saved') );
return $return;
}
-