| [ XREF Home ] [ Index ] |
PHP Cross Reference of WordPress TrunkProvided by Yoast |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * WordPress Image Editor 4 * 5 * @package WordPress 6 * @subpackage Administration 7 */ 8 9 function wp_image_editor($post_id, $msg = false) { 10 $nonce = wp_create_nonce("image_editor-$post_id"); 11 $meta = wp_get_attachment_metadata($post_id); 12 $thumb = image_get_intermediate_size($post_id, 'thumbnail'); 13 $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']); 14 $note = ''; 15 16 if ( is_array($meta) && isset($meta['width']) ) 17 $big = max( $meta['width'], $meta['height'] ); 18 else 19 die( __('Image data does not exist. Please re-upload the image.') ); 20 21 $sizer = $big > 400 ? 400 / $big : 1; 22 23 $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true ); 24 $can_restore = !empty($backup_sizes) && isset($backup_sizes['full-orig']) 25 && $backup_sizes['full-orig']['file'] != basename($meta['file']); 26 27 if ( $msg ) { 28 if ( isset($msg->error) ) 29 $note = "<div class='error'><p>$msg->error</p></div>"; 30 elseif ( isset($msg->msg) ) 31 $note = "<div class='updated'><p>$msg->msg</p></div>"; 32 } 33 34 ?> 35 <div class="imgedit-wrap"> 36 <?php echo $note; ?> 37 <table id="imgedit-panel-<?php echo $post_id; ?>"><tbody> 38 <tr><td> 39 <div class="imgedit-menu"> 40 <div onclick="imageEdit.crop(<?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-crop disabled" title="<?php esc_attr_e( 'Crop' ); ?>"></div><?php 41 42 // On some setups GD library does not provide imagerotate() - Ticket #11536 43 if ( function_exists('imagerotate') ) { ?> 44 <div class="imgedit-rleft" onclick="imageEdit.rotate( 90, <?php echo "$post_id, '$nonce'"; ?>, this)" title="<?php esc_attr_e( 'Rotate counter-clockwise' ); ?>"></div> 45 <div class="imgedit-rright" onclick="imageEdit.rotate(-90, <?php echo "$post_id, '$nonce'"; ?>, this)" title="<?php esc_attr_e( 'Rotate clockwise' ); ?>"></div> 46 <?php } else { 47 $note_gdlib = esc_attr__('Image rotation is not supported by your web host (function imagerotate() is missing)'); 48 ?> 49 <div class="imgedit-rleft disabled" title="<?php echo $note_gdlib; ?>"></div> 50 <div class="imgedit-rright disabled" title="<?php echo $note_gdlib; ?>"></div> 51 <?php } ?> 52 53 <div onclick="imageEdit.flip(1, <?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-flipv" title="<?php esc_attr_e( 'Flip vertically' ); ?>"></div> 54 <div onclick="imageEdit.flip(2, <?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-fliph" title="<?php esc_attr_e( 'Flip horizontally' ); ?>"></div> 55 56 <div id="image-undo-<?php echo $post_id; ?>" onclick="imageEdit.undo(<?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-undo disabled" title="<?php esc_attr_e( 'Undo' ); ?>"></div> 57 <div id="image-redo-<?php echo $post_id; ?>" onclick="imageEdit.redo(<?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-redo disabled" title="<?php esc_attr_e( 'Redo' ); ?>"></div> 58 <br class="clear" /> 59 </div> 60 61 <input type="hidden" id="imgedit-sizer-<?php echo $post_id; ?>" value="<?php echo $sizer; ?>" /> 62 <input type="hidden" id="imgedit-minthumb-<?php echo $post_id; ?>" value="<?php echo ( get_option('thumbnail_size_w') . ':' . get_option('thumbnail_size_h') ); ?>" /> 63 <input type="hidden" id="imgedit-history-<?php echo $post_id; ?>" value="" /> 64 <input type="hidden" id="imgedit-undone-<?php echo $post_id; ?>" value="0" /> 65 <input type="hidden" id="imgedit-selection-<?php echo $post_id; ?>" value="" /> 66 <input type="hidden" id="imgedit-x-<?php echo $post_id; ?>" value="<?php echo $meta['width']; ?>" /> 67 <input type="hidden" id="imgedit-y-<?php echo $post_id; ?>" value="<?php echo $meta['height']; ?>" /> 68 69 <div id="imgedit-crop-<?php echo $post_id; ?>" class="imgedit-crop-wrap"> 70 <img id="image-preview-<?php echo $post_id; ?>" onload="imageEdit.imgLoaded('<?php echo $post_id; ?>')" src="<?php echo admin_url('admin-ajax.php'); ?>?action=imgedit-preview&_ajax_nonce=<?php echo $nonce; ?>&postid=<?php echo $post_id; ?>&rand=<?php echo rand(1, 99999); ?>" /> 71 </div> 72 73 <div class="imgedit-submit"> 74 <input type="button" onclick="imageEdit.close(<?php echo $post_id; ?>, 1)" class="button" value="<?php esc_attr_e( 'Cancel' ); ?>" /> 75 <input type="button" onclick="imageEdit.save(<?php echo "$post_id, '$nonce'"; ?>)" disabled="disabled" class="button-primary imgedit-submit-btn" value="<?php esc_attr_e( 'Save' ); ?>" /> 76 </div> 77 </td> 78 79 <td class="imgedit-settings"> 80 <div class="imgedit-group"> 81 <div class="imgedit-group-top"> 82 <a class="imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" href="#"><strong><?php _e('Scale Image'); ?></strong></a> 83 <div class="imgedit-help"> 84 <p><?php _e('You can proportionally scale the original image. For best results the scaling should be done before performing any other operations on it like crop, rotate, etc. Note that if you make the image larger it may become fuzzy.'); ?></p> 85 <p><?php printf( __('Original dimensions %s'), $meta['width'] . '×' . $meta['height'] ); ?></p> 86 <div class="imgedit-submit"> 87 <span class="nowrap"><input type="text" id="imgedit-scale-width-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1)" style="width:4em;" value="<?php echo $meta['width']; ?>" />×<input type="text" id="imgedit-scale-height-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0)" style="width:4em;" value="<?php echo $meta['height']; ?>" /> 88 <span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php echo $post_id; ?>">!</span></span> 89 <input type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'scale')" class="button-primary" value="<?php esc_attr_e( 'Scale' ); ?>" /> 90 </div> 91 </div> 92 </div> 93 94 <?php if ( $can_restore ) { ?> 95 96 <div class="imgedit-group-top"> 97 <a class="imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" href="#"><strong><?php _e('Restore Original Image'); ?></strong></a> 98 <div class="imgedit-help"> 99 <p><?php _e('Discard any changes and restore the original image.'); 100 101 if ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) 102 echo ' '.__('Previously edited copies of the image will not be deleted.'); 103 104 ?></p> 105 <div class="imgedit-submit"> 106 <input type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'restore')" class="button-primary" value="<?php esc_attr_e( 'Restore image' ); ?>" <?php echo $can_restore; ?> /> 107 </div> 108 </div> 109 </div> 110 111 <?php } ?> 112 113 </div> 114 115 <div class="imgedit-group"> 116 <div class="imgedit-group-top"> 117 <strong><?php _e('Image Crop'); ?></strong> 118 <a class="imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php _e('(help)'); ?></a> 119 <div class="imgedit-help"> 120 <p><?php _e('The image can be cropped by clicking on it and dragging to select the desired part. While dragging the dimensions of the selection are displayed below.'); ?></p> 121 <strong><?php _e('Keyboard Shortcuts'); ?></strong> 122 <ul> 123 <li><?php _e('Arrow: move by 10px'); ?></li> 124 <li><?php _e('Shift + arrow: move by 1px'); ?></li> 125 <li><?php _e('Ctrl + arrow: resize by 10px'); ?></li> 126 <li><?php _e('Ctrl + Shift + arrow: resize by 1px'); ?></li> 127 <li><?php _e('Shift + drag: lock aspect ratio'); ?></li> 128 </ul> 129 130 <p><strong><?php _e('Crop Aspect Ratio'); ?></strong><br /> 131 <?php _e('You can specify the crop selection aspect ratio then hold down the Shift key while dragging to lock it. The values can be 1:1 (square), 4:3, 16:9, etc. If there is a selection, specifying aspect ratio will set it immediately.'); ?></p> 132 133 <p><strong><?php _e('Crop Selection'); ?></strong><br /> 134 <?php _e('Once started, the selection can be adjusted by entering new values (in pixels). Note that these values are scaled to approximately match the original image dimensions. The minimum selection size equals the thumbnail size as set in the Media settings.'); ?></p> 135 </div> 136 </div> 137 138 <p> 139 <?php _e('Aspect ratio:'); ?> 140 <span class="nowrap"> 141 <input type="text" id="imgedit-crop-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 0, this)" style="width:3em;" /> 142 : 143 <input type="text" id="imgedit-crop-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 1, this)" style="width:3em;" /> 144 </span> 145 </p> 146 147 <p id="imgedit-crop-sel-<?php echo $post_id; ?>"> 148 <?php _e('Selection:'); ?> 149 <span class="nowrap"> 150 <input type="text" id="imgedit-sel-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>)" style="width:4em;" /> 151 : 152 <input type="text" id="imgedit-sel-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>)" style="width:4em;" /> 153 </span> 154 </p> 155 </div> 156 157 <?php if ( $thumb && $sub_sizes ) { 158 $thumb_img = wp_constrain_dimensions( $thumb['width'], $thumb['height'], 160, 120 ); 159 ?> 160 161 <div class="imgedit-group imgedit-applyto"> 162 <div class="imgedit-group-top"> 163 <strong><?php _e('Thumbnail Settings'); ?></strong> 164 <a class="imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php _e('(help)'); ?></a> 165 <p class="imgedit-help"><?php _e('The thumbnail image can be cropped differently. For example it can be square or contain only a portion of the original image to showcase it better. Here you can select whether to apply changes to all image sizes or make the thumbnail different.'); ?></p> 166 </div> 167 168 <p> 169 <img src="<?php echo $thumb['url']; ?>" width="<?php echo $thumb_img[0]; ?>" height="<?php echo $thumb_img[1]; ?>" class="imgedit-size-preview" alt="" /><br /><?php _e('Current thumbnail'); ?> 170 </p> 171 172 <p id="imgedit-save-target-<?php echo $post_id; ?>"> 173 <strong><?php _e('Apply changes to:'); ?></strong><br /> 174 175 <label class="imgedit-label"> 176 <input type="radio" name="imgedit-target-<?php echo $post_id; ?>" value="all" checked="checked" /> 177 <?php _e('All image sizes'); ?></label> 178 179 <label class="imgedit-label"> 180 <input type="radio" name="imgedit-target-<?php echo $post_id; ?>" value="thumbnail" /> 181 <?php _e('Thumbnail'); ?></label> 182 183 <label class="imgedit-label"> 184 <input type="radio" name="imgedit-target-<?php echo $post_id; ?>" value="nothumb" /> 185 <?php _e('All sizes except thumbnail'); ?></label> 186 </p> 187 </div> 188 189 <?php } ?> 190 191 </td></tr> 192 </tbody></table> 193 <div class="imgedit-wait" id="imgedit-wait-<?php echo $post_id; ?>"></div> 194 <script type="text/javascript">imageEdit.init(<?php echo $post_id; ?>);</script> 195 <div class="hidden" id="imgedit-leaving-<?php echo $post_id; ?>"><?php _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor."); ?></div> 196 </div> 197 <?php 198 } 199 200 function load_image_to_edit($post_id, $mime_type, $size = 'full') { 201 $filepath = get_attached_file($post_id); 202 203 if ( $filepath && file_exists($filepath) ) { 204 if ( 'full' != $size && ( $data = image_get_intermediate_size($post_id, $size) ) ) { 205 $filepath = apply_filters('load_image_to_edit_filesystempath', path_join( dirname($filepath), $data['file'] ), $post_id, $size); 206 } 207 } elseif ( function_exists('fopen') && function_exists('ini_get') && true == ini_get('allow_url_fopen') ) { 208 $filepath = apply_filters('load_image_to_edit_attachmenturl', wp_get_attachment_url($post_id) , $post_id, $size); 209 } 210 211 $filepath = apply_filters('load_image_to_edit_path', $filepath, $post_id, $size); 212 if ( empty($filepath) ) 213 return false; 214 215 switch ( $mime_type ) { 216 case 'image/jpeg': 217 $image = imagecreatefromjpeg($filepath); 218 break; 219 case 'image/png': 220 $image = imagecreatefrompng($filepath); 221 break; 222 case 'image/gif': 223 $image = imagecreatefromgif($filepath); 224 break; 225 default: 226 $image = false; 227 break; 228 } 229 if ( is_resource($image) ) { 230 $image = apply_filters('load_image_to_edit', $image, $post_id, $size); 231 if ( function_exists('imagealphablending') && function_exists('imagesavealpha') ) { 232 imagealphablending($image, false); 233 imagesavealpha($image, true); 234 } 235 } 236 return $image; 237 } 238 239 function wp_stream_image($image, $mime_type, $post_id) { 240 $image = apply_filters('image_save_pre', $image, $post_id); 241 242 switch ( $mime_type ) { 243 case 'image/jpeg': 244 header('Content-Type: image/jpeg'); 245 return imagejpeg($image, null, 90); 246 case 'image/png': 247 header('Content-Type: image/png'); 248 return imagepng($image); 249 case 'image/gif': 250 header('Content-Type: image/gif'); 251 return imagegif($image); 252 default: 253 return false; 254 } 255 } 256 257 function wp_save_image_file($filename, $image, $mime_type, $post_id) { 258 $image = apply_filters('image_save_pre', $image, $post_id); 259 $saved = apply_filters('wp_save_image_file', null, $filename, $image, $mime_type, $post_id); 260 if ( null !== $saved ) 261 return $saved; 262 263 switch ( $mime_type ) { 264 case 'image/jpeg': 265 return imagejpeg( $image, $filename, apply_filters( 'jpeg_quality', 90, 'edit_image' ) ); 266 case 'image/png': 267 return imagepng($image, $filename); 268 case 'image/gif': 269 return imagegif($image, $filename); 270 default: 271 return false; 272 } 273 } 274 275 function _image_get_preview_ratio($w, $h) { 276 $max = max($w, $h); 277 return $max > 400 ? (400 / $max) : 1; 278 } 279 280 function _rotate_image_resource($img, $angle) { 281 if ( function_exists('imagerotate') ) { 282 $rotated = imagerotate($img, $angle, 0); 283 if ( is_resource($rotated) ) { 284 imagedestroy($img); 285 $img = $rotated; 286 } 287 } 288 return $img; 289 } 290 291 292 function _flip_image_resource($img, $horz, $vert) { 293 $w = imagesx($img); 294 $h = imagesy($img); 295 $dst = wp_imagecreatetruecolor($w, $h); 296 if ( is_resource($dst) ) { 297 $sx = $vert ? ($w - 1) : 0; 298 $sy = $horz ? ($h - 1) : 0; 299 $sw = $vert ? -$w : $w; 300 $sh = $horz ? -$h : $h; 301 302 if ( imagecopyresampled($dst, $img, 0, 0, $sx, $sy, $w, $h, $sw, $sh) ) { 303 imagedestroy($img); 304 $img = $dst; 305 } 306 } 307 return $img; 308 } 309 310 function _crop_image_resource($img, $x, $y, $w, $h) { 311 $dst = wp_imagecreatetruecolor($w, $h); 312 if ( is_resource($dst) ) { 313 if ( imagecopy($dst, $img, 0, 0, $x, $y, $w, $h) ) { 314 imagedestroy($img); 315 $img = $dst; 316 } 317 } 318 return $img; 319 } 320 321 function image_edit_apply_changes($img, $changes) { 322 323 if ( !is_array($changes) ) 324 return $img; 325 326 // expand change operations 327 foreach ( $changes as $key => $obj ) { 328 if ( isset($obj->r) ) { 329 $obj->type = 'rotate'; 330 $obj->angle = $obj->r; 331 unset($obj->r); 332 } elseif ( isset($obj->f) ) { 333 $obj->type = 'flip'; 334 $obj->axis = $obj->f; 335 unset($obj->f); 336 } elseif ( isset($obj->c) ) { 337 $obj->type = 'crop'; 338 $obj->sel = $obj->c; 339 unset($obj->c); 340 } 341 $changes[$key] = $obj; 342 } 343 344 // combine operations 345 if ( count($changes) > 1 ) { 346 $filtered = array($changes[0]); 347 for ( $i = 0, $j = 1; $j < count($changes); $j++ ) { 348 $combined = false; 349 if ( $filtered[$i]->type == $changes[$j]->type ) { 350 switch ( $filtered[$i]->type ) { 351 case 'rotate': 352 $filtered[$i]->angle += $changes[$j]->angle; 353 $combined = true; 354 break; 355 case 'flip': 356 $filtered[$i]->axis ^= $changes[$j]->axis; 357 $combined = true; 358 break; 359 } 360 } 361 if ( !$combined ) 362 $filtered[++$i] = $changes[$j]; 363 } 364 $changes = $filtered; 365 unset($filtered); 366 } 367 368 // image resource before applying the changes 369 $img = apply_filters('image_edit_before_change', $img, $changes); 370 371 foreach ( $changes as $operation ) { 372 switch ( $operation->type ) { 373 case 'rotate': 374 if ( $operation->angle != 0 ) 375 $img = _rotate_image_resource($img, $operation->angle); 376 break; 377 case 'flip': 378 if ( $operation->axis != 0 ) 379 $img = _flip_image_resource($img, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0); 380 break; 381 case 'crop': 382 $sel = $operation->sel; 383 $scale = 1 / _image_get_preview_ratio( imagesx($img), imagesy($img) ); // discard preview scaling 384 $img = _crop_image_resource($img, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale); 385 break; 386 } 387 } 388 389 return $img; 390 } 391 392 function stream_preview_image($post_id) { 393 $post = get_post($post_id); 394 @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) ); 395 $img = load_image_to_edit( $post_id, $post->post_mime_type, array(400, 400) ); 396 397 if ( !is_resource($img) ) 398 return false; 399 400 $changes = !empty($_REQUEST['history']) ? json_decode( stripslashes($_REQUEST['history']) ) : null; 401 if ( $changes ) 402 $img = image_edit_apply_changes($img, $changes); 403 404 // scale the image 405 $w = imagesx($img); 406 $h = imagesy($img); 407 $ratio = _image_get_preview_ratio($w, $h); 408 $w2 = $w * $ratio; 409 $h2 = $h * $ratio; 410 411 $preview = wp_imagecreatetruecolor($w2, $h2); 412 imagecopyresampled( $preview, $img, 0, 0, 0, 0, $w2, $h2, $w, $h ); 413 wp_stream_image($preview, $post->post_mime_type, $post_id); 414 415 imagedestroy($preview); 416 imagedestroy($img); 417 return true; 418 } 419 420 function wp_restore_image($post_id) { 421 $meta = wp_get_attachment_metadata($post_id); 422 $file = get_attached_file($post_id); 423 $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true ); 424 $restored = false; 425 $msg = new stdClass; 426 427 if ( !is_array($backup_sizes) ) { 428 $msg->error = __('Cannot load image metadata.'); 429 return $msg; 430 } 431 432 $parts = pathinfo($file); 433 $suffix = time() . rand(100, 999); 434 $default_sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') ); 435 436 if ( isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig']) ) { 437 $data = $backup_sizes['full-orig']; 438 439 if ( $parts['basename'] != $data['file'] ) { 440 if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) { 441 // delete only if it's edited image 442 if ( preg_match('/-e[0-9]{13}\./', $parts['basename']) ) { 443 $delpath = apply_filters('wp_delete_file', $file); 444 @unlink($delpath); 445 } 446 } else { 447 $backup_sizes["full-$suffix"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']); 448 } 449 } 450 451 $restored_file = path_join($parts['dirname'], $data['file']); 452 $restored = update_attached_file($post_id, $restored_file); 453 454 $meta['file'] = _wp_relative_upload_path( $restored_file ); 455 $meta['width'] = $data['width']; 456 $meta['height'] = $data['height']; 457 list ( $uwidth, $uheight ) = wp_constrain_dimensions($meta['width'], $meta['height'], 128, 96); 458 $meta['hwstring_small'] = "height='$uheight' width='$uwidth'"; 459 } 460 461 foreach ( $default_sizes as $default_size ) { 462 if ( isset($backup_sizes["$default_size-orig"]) ) { 463 $data = $backup_sizes["$default_size-orig"]; 464 if ( isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file'] ) { 465 if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) { 466 // delete only if it's edited image 467 if ( preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file']) ) { 468 $delpath = apply_filters( 'wp_delete_file', path_join($parts['dirname'], $meta['sizes'][$default_size]['file']) ); 469 @unlink($delpath); 470 } 471 } else { 472 $backup_sizes["$default_size-{$suffix}"] = $meta['sizes'][$default_size]; 473 } 474 } 475 476 $meta['sizes'][$default_size] = $data; 477 } else { 478 unset($meta['sizes'][$default_size]); 479 } 480 } 481 482 if ( !wp_update_attachment_metadata($post_id, $meta) || !update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes) ) { 483 $msg->error = __('Cannot save image metadata.'); 484 return $msg; 485 } 486 487 if ( !$restored ) 488 $msg->error = __('Image metadata is inconsistent.'); 489 else 490 $msg->msg = __('Image restored successfully.'); 491 492 return $msg; 493 } 494 495 function wp_save_image($post_id) { 496 $return = new stdClass; 497 $success = $delete = $scaled = $nocrop = false; 498 $post = get_post($post_id); 499 @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) ); 500 $img = load_image_to_edit($post_id, $post->post_mime_type); 501 502 if ( !is_resource($img) ) { 503 $return->error = esc_js( __('Unable to create new image.') ); 504 return $return; 505 } 506 507 $fwidth = !empty($_REQUEST['fwidth']) ? intval($_REQUEST['fwidth']) : 0; 508 $fheight = !empty($_REQUEST['fheight']) ? intval($_REQUEST['fheight']) : 0; 509 $target = !empty($_REQUEST['target']) ? preg_replace('/[^a-z0-9_-]+/i', '', $_REQUEST['target']) : ''; 510 $scale = !empty($_REQUEST['do']) && 'scale' == $_REQUEST['do']; 511 512 if ( $scale && $fwidth > 0 && $fheight > 0 ) { 513 $sX = imagesx($img); 514 $sY = imagesy($img); 515 516 // check if it has roughly the same w / h ratio 517 $diff = round($sX / $sY, 2) - round($fwidth / $fheight, 2); 518 if ( -0.1 < $diff && $diff < 0.1 ) { 519 // scale the full size image 520 $dst = wp_imagecreatetruecolor($fwidth, $fheight); 521 if ( imagecopyresampled( $dst, $img, 0, 0, 0, 0, $fwidth, $fheight, $sX, $sY ) ) { 522 imagedestroy($img); 523 $img = $dst; 524 $scaled = true; 525 } 526 } 527 528 if ( !$scaled ) { 529 $return->error = esc_js( __('Error while saving the scaled image. Please reload the page and try again.') ); 530 return $return; 531 } 532 } elseif ( !empty($_REQUEST['history']) ) { 533 $changes = json_decode( stripslashes($_REQUEST['history']) ); 534 if ( $changes ) 535 $img = image_edit_apply_changes($img, $changes); 536 } else { 537 $return->error = esc_js( __('Nothing to save, the image has not changed.') ); 538 return $return; 539 } 540 541 $meta = wp_get_attachment_metadata($post_id); 542 $backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true ); 543 544 if ( !is_array($meta) ) { 545 $return->error = esc_js( __('Image data does not exist. Please re-upload the image.') ); 546 return $return; 547 } 548 549 if ( !is_array($backup_sizes) ) 550 $backup_sizes = array(); 551 552 // generate new filename 553 $path = get_attached_file($post_id); 554 $path_parts = pathinfo( $path ); 555 $filename = $path_parts['filename']; 556 $suffix = time() . rand(100, 999); 557 558 if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE && 559 isset($backup_sizes['full-orig']) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] ) { 560 561 if ( 'thumbnail' == $target ) 562 $new_path = "{$path_parts['dirname']}/{$filename}-temp.{$path_parts['extension']}"; 563 else 564 $new_path = $path; 565 } else { 566 while( true ) { 567 $filename = preg_replace( '/-e([0-9]+)$/', '', $filename ); 568 $filename .= "-e{$suffix}"; 569 $new_filename = "{$filename}.{$path_parts['extension']}"; 570 $new_path = "{$path_parts['dirname']}/$new_filename"; 571 if ( file_exists($new_path) ) 572 $suffix++; 573 else 574 break; 575 } 576 } 577 578 // save the full-size file, also needed to create sub-sizes 579 if ( !wp_save_image_file($new_path, $img, $post->post_mime_type, $post_id) ) { 580 $return->error = esc_js( __('Unable to save the image.') ); 581 return $return; 582 } 583 584 if ( 'nothumb' == $target || 'all' == $target || 'full' == $target || $scaled ) { 585 $tag = false; 586 if ( isset($backup_sizes['full-orig']) ) { 587 if ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] ) 588 $tag = "full-$suffix"; 589 } else { 590 $tag = 'full-orig'; 591 } 592 593 if ( $tag ) 594 $backup_sizes[$tag] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $path_parts['basename']); 595 596 $success = update_attached_file($post_id, $new_path); 597 598 $meta['file'] = _wp_relative_upload_path($new_path); 599 $meta['width'] = imagesx($img); 600 $meta['height'] = imagesy($img); 601 602 list ( $uwidth, $uheight ) = wp_constrain_dimensions($meta['width'], $meta['height'], 128, 96); 603 $meta['hwstring_small'] = "height='$uheight' width='$uwidth'"; 604 605 if ( $success && ('nothumb' == $target || 'all' == $target) ) { 606 $sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') ); 607 if ( 'nothumb' == $target ) 608 $sizes = array_diff( $sizes, array('thumbnail') ); 609 } 610 611 $return->fw = $meta['width']; 612 $return->fh = $meta['height']; 613 } elseif ( 'thumbnail' == $target ) { 614 $sizes = array( 'thumbnail' ); 615 $success = $delete = $nocrop = true; 616 } 617 618 if ( isset($sizes) ) { 619 foreach ( $sizes as $size ) { 620 $tag = false; 621 if ( isset($meta['sizes'][$size]) ) { 622 if ( isset($backup_sizes["$size-orig"]) ) { 623 if ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes["$size-orig"]['file'] != $meta['sizes'][$size]['file'] ) 624 $tag = "$size-$suffix"; 625 } else { 626 $tag = "$size-orig"; 627 } 628 629 if ( $tag ) 630 $backup_sizes[$tag] = $meta['sizes'][$size]; 631 } 632 633 $crop = $nocrop ? false : get_option("{$size}_crop"); 634 $resized = image_make_intermediate_size($new_path, get_option("{$size}_size_w"), get_option("{$size}_size_h"), $crop ); 635 636 if ( $resized ) 637 $meta['sizes'][$size] = $resized; 638 else 639 unset($meta['sizes'][$size]); 640 } 641 } 642 643 if ( $success ) { 644 wp_update_attachment_metadata($post_id, $meta); 645 update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes); 646 647 if ( $target == 'thumbnail' || $target == 'all' || $target == 'full' ) { 648 $file_url = wp_get_attachment_url($post_id); 649 if ( $thumb = $meta['sizes']['thumbnail'] ) 650 $return->thumbnail = path_join( dirname($file_url), $thumb['file'] ); 651 else 652 $return->thumbnail = "$file_url?w=128&h=128"; 653 } 654 } else { 655 $delete = true; 656 } 657 658 if ( $delete ) { 659 $delpath = apply_filters('wp_delete_file', $new_path); 660 @unlink($delpath); 661 } 662 663 imagedestroy($img); 664 665 $return->msg = esc_js( __('Image saved') ); 666 return $return; 667 } 668
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Wed Jun 1 08:30:02 2011 |
Cross-referenced by PHPXref 0.7 Provided by Yoast and awesome WordPress Hosting |