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 = "
";
elseif ( isset($msg->msg) )
$note = "";
}
?>
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;
}