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']); // temp convert backup sizes if ( isset($meta['sizes']) && is_array($meta['sizes']) ) { $update = false; foreach ( $meta['sizes'] as $name => $val ) { if ( strpos($name, 'backup-') === 0 ) { $m = array(); preg_match('/backup-([0-9]+)-(.*)/', $name, $m); if ( !isset($backup_sizes["{$m[2]}-orig"]) ) $n = "{$m[2]}-orig"; else $n = "{$m[2]}-{$m[1]}"; $backup_sizes[$n] = $val; unset($meta['sizes'][$name]); $update = true; } } if ( $update ) { wp_update_attachment_metadata( $post_id, $meta ); update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes); } } // end temp if ( $msg ) { if ( isset($msg->error) ) $note = "

$msg->error

"; elseif ( isset($msg->msg) ) $note = "

$msg->msg

"; } ?>
, this)" class="imgedit-crop disabled" title="">
, this)" class="imgedit-rleft" title="">
, this)" class="imgedit-rright" title="">
, this)" class="imgedit-fliph" title="">
, this)" class="imgedit-flipv" title="">
, this)" class="imgedit-undo disabled" title="">
, this)" class="imgedit-redo disabled" title="">

)" class="button-primary imgedit-submit-btn" value="" />

× ! , 'scale')" class="button-primary" value="" />

, 'restore')" class="button-primary" value="" />



:

:



ID); if ( 'full' != $size && ( $data = image_get_intermediate_size($post->ID, $size) ) ) $filename = path_join( dirname($filename), $data['file'] ); switch ( $post->post_mime_type ) { case 'image/jpeg': $image = imagecreatefromjpeg($filename); break; case 'image/png': $image = imagecreatefrompng($filename); break; case 'image/gif': $image = imagecreatefromgif($filename); break; default: $image = false; break; } if ( is_resource($image) ) { $image = apply_filters('load_image_to_edit', $image, $post->ID, $size); if ( function_exists('imagealphablending') && function_exists('imagesavealpha') ) { imagealphablending($image, false); imagesavealpha($image, true); } } return $image; } function wp_stream_image($image, $mime_type, $post_id = 0, $intermediate_size = '') { $image = apply_filters('image_save_pre', $image, $post->ID, $intermediate_size); 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 = 0, $intermediate_size = '') { $image = apply_filters('image_save_pre', $image, $post->ID, $intermediate_size); 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; } } function _image_get_preview_ratio($w, $h) { $max = max($w, $h); return $max > 400 ? (400 / $max) : 1; } function _rotate_image_resource($img, $angle) { if ( function_exists('imagerotate') ) { $rotated = imagerotate($img, $angle, 0); if ( is_resource($rotated) ) { imagedestroy($img); $img = $rotated; } } return $img; } function _flip_image_resource($img, $horz, $vert) { $w = imagesx($img); $h = imagesy($img); $dst = wp_imagecreatetruecolor($w, $h); if ( is_resource($dst) ) { $sx = $vert ? ($w - 1) : 0; $sy = $horz ? ($h - 1) : 0; $sw = $vert ? -$w : $w; $sh = $horz ? -$h : $h; if ( imagecopyresampled($dst, $img, 0, 0, $sx, $sy, $w, $h, $sw, $sh) ) { imagedestroy($img); $img = $dst; } } return $img; } function _crop_image_resource($img, $x, $y, $w, $h) { $dst = wp_imagecreatetruecolor($w, $h); if ( is_resource($dst) ) { if ( imagecopy($dst, $img, 0, 0, $x, $y, $w, $h) ) { imagedestroy($img); $img = $dst; } } return $img; } function image_edit_apply_changes($img, $changes) { if ( !is_array($changes) ) return $img; // expand change operations foreach ( $changes as $key => $obj ) { if ( isset($obj->r) ) { $obj->type = 'rotate'; $obj->angle = $obj->r; unset($obj->r); } elseif ( isset($obj->f) ) { $obj->type = 'flip'; $obj->axis = $obj->f; unset($obj->f); } elseif ( isset($obj->c) ) { $obj->type = 'crop'; $obj->sel = $obj->c; unset($obj->c); } $changes[$key] = $obj; } // combine operations if ( count($changes) > 1 ) { $filtered = array($changes[0]); for ( $i = 0, $j = 1; $j < count($changes); $j++ ) { $combined = false; if ( $filtered[$i]->type == $changes[$j]->type ) { switch ( $filtered[$i]->type ) { case 'rotate': $filtered[$i]->angle += $changes[$j]->angle; $combined = true; break; case 'flip': $filtered[$i]->axis ^= $changes[$j]->axis; $combined = true; break; } } if ( !$combined ) $filtered[++$i] = $changes[$j]; } $changes = $filtered; unset($filtered); } // image resource before applying the changes $img = apply_filters('image_edit_before_change', $img, $changes); foreach ( $changes as $operation ) { switch ( $operation->type ) { case 'rotate': if ( $operation->angle != 0 ) $img = _rotate_image_resource($img, $operation->angle); break; case 'flip': if ( $operation->axis != 0 ) $img = _flip_image_resource($img, ($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); break; } } return $img; } function stream_preview_image($post_id) { $post = get_post($post_id); @ini_set('memory_limit', '256M'); $img = load_image_to_edit( $post, array(400, 400) ); if ( !is_resource($img) ) return false; $changes = !empty($_REQUEST['history']) ? json_decode( stripslashes($_REQUEST['history']) ) : null; if ( $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; $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); imagedestroy($preview); imagedestroy($img); return true; } function wp_restore_image($post_id) { $meta = wp_get_attachment_metadata($post_id); $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true ); $restored = false; $msg = ''; if ( !is_array($backup_sizes) ) { $msg->error = __('Cannot load image metadata.'); return $msg; } $parts = pathinfo($meta['file']); $suffix = time() . rand(100, 999); $default_sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') ); $default_sizes[] = 'full'; foreach ( $default_sizes as $default_size ) { if ( isset($backup_sizes["$default_size-orig"]) ) { $data = $backup_sizes["$default_size-orig"]; if ( 'full' == $default_size ) { $backup_sizes["full-$suffix"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']); $meta['file'] = path_join($parts['dirname'], $data['file']); $meta['width'] = $data['width']; $meta['height'] = $data['height']; list ( $uwidth, $uheight ) = wp_shrink_dimensions($meta['width'], $meta['height']); $meta['hwstring_small'] = "height='$uheight' width='$uwidth'"; $restored = update_attached_file($post_id, $meta['file']); } else { if ( isset($meta['sizes'][$default_size]) ) $backup_sizes["$default_size-{$suffix}"] = $meta['sizes'][$default_size]; $meta['sizes'][$default_size] = $data; } } } if ( !wp_update_attachment_metadata($post_id, $meta) || !update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes) ) { $msg->error = __('Cannot save image metadata.'); return $msg; } if ( !$restored ) $msg->error = __('Image metadata is inconsistent.'); else $msg->msg = __('Image restored successfully.'); return $msg; } function wp_save_image($post_id) { $return = ''; $success = $delete = $scaled = $nocrop = false; $post = get_post($post_id); @ini_set('memory_limit', '256M'); $img = load_image_to_edit($post); if ( !is_resource($img) ) { $return->error = esc_js( __('Unable to create new image.') ); return $return; } $fwidth = !empty($_REQUEST['fwidth']) ? intval($_REQUEST['fwidth']) : 0; $fheight = !empty($_REQUEST['fheight']) ? intval($_REQUEST['fheight']) : 0; $target = !empty($_REQUEST['target']) ? preg_replace('/[^a-z0-9_-]+/i', '', $_REQUEST['target']) : ''; $scale = !empty($_REQUEST['do']) && 'scale' == $_REQUEST['do']; if ( $scale && $fwidth > 0 && $fheight > 0 ) { $sX = imagesx($img); $sY = imagesy($img); // check if it has roughly the same w / h ratio if ( round($sX / $sY, 2) == round($fwidth / $fheight, 2) ) { // 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; $scaled = true; } } if ( !$scaled ) { $return->error = esc_js( __('Error while saving the scaled image. Please reload the page and try again.') ); return $return; } } elseif ( !empty($_REQUEST['history']) ) { $changes = json_decode( stripslashes($_REQUEST['history']) ); if ( $changes ) $img = image_edit_apply_changes($img, $changes); } else { $return->error = esc_js( __('Nothing to save, the image has not changed.') ); return $return; } $meta = wp_get_attachment_metadata($post_id); $backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true ); if ( !is_array($meta) ) { $return->error = esc_js( __('Image data does not exist. Please re-upload the image.') ); return $return; } if ( !is_array($backup_sizes) ) $backup_sizes = array(); // generate new filename $path = get_attached_file($post_id); $path_parts = pathinfo52( $path ); $filename = $path_parts['filename']; $suffix = time() . rand(100, 999); while( true ) { $filename = preg_replace( '/-e([0-9]+)$/', '', $filename ); $filename .= "-e{$suffix}"; $new_filename = "{$filename}.{$path_parts['extension']}"; $new_path = "{$path_parts['dirname']}/$new_filename"; if ( file_exists($new_path) ) $suffix++; else break; } // 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; } if ( 'nothumb' == $target || 'all' == $target || $scaled ) { $tag = !isset($backup_sizes['full-orig']) ? 'full-orig' : "full-$suffix"; $backup_sizes[$tag] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $path_parts['basename']); $success = update_attached_file($post_id, $new_path); $meta['file'] = get_attached_file($post_id, true); // get the path unfiltered $meta['width'] = imagesx($img); $meta['height'] = imagesy($img); list ( $uwidth, $uheight ) = wp_shrink_dimensions($meta['width'], $meta['height']); $meta['hwstring_small'] = "height='$uheight' width='$uwidth'"; if ( $success && ('nothumb' == $target || 'all' == $target) ) { $sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') ); if ( 'nothumb' == $target ) $sizes = array_diff( $sizes, array('thumbnail') ); } $return->fw = $meta['width']; $return->fh = $meta['height']; } elseif ( 'thumbnail' == $target ) { $sizes = array( 'thumbnail' ); $success = $delete = $nocrop = true; } if ( isset($sizes) ) { foreach ( $sizes as $size ) { if ( isset($meta['sizes'][$size]) ) { $tag = !isset($backup_sizes["$size-orig"]) ? "$size-orig" : "$size-$suffix"; $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 ( $resized ) $meta['sizes'][$size] = $resized; else unset($meta['sizes'][$size]); } } if ( $success ) { wp_update_attachment_metadata($post_id, $meta); update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes); if ( $target == 'thumbnail' || $target == 'all' ) { if ( $thumb = $meta['sizes']['thumbnail'] ) { $file_url = wp_get_attachment_url($post_id); $return->thumbnail = path_join( dirname($file_url), $thumb['file'] ); } } } else { $delete = true; } if ( $delete ) { $delpath = apply_filters('wp_delete_file', $new_path); @unlink($delpath); } imagedestroy($img); $return->msg = esc_js( __('Image saved') ); return $return; }