Make WordPress Core


Ignore:
Timestamp:
10/01/2012 08:59:06 PM (12 years ago)
Author:
ryan
Message:

Introduce WP_Image_Editor, WP_Image_Editor_Imagick, and WP_Image_Editor_GD. Abstracts image editing API and adds support for ImageMagick.

Props DH-Shredder, kurtpayne, markoheijnen
see #6821

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/media.php

    r22073 r22094  
    237237
    238238/**
    239  * Load an image from a string, if PHP supports it.
    240  *
    241  * @since 2.1.0
    242  *
    243  * @param string $file Filename of the image to load.
    244  * @return resource The resulting image resource on success, Error string on failure.
    245  */
    246 function wp_load_image( $file ) {
    247     if ( is_numeric( $file ) )
    248         $file = get_attached_file( $file );
    249 
    250     if ( ! file_exists( $file ) )
    251         return sprintf(__('File “%s” doesn’t exist?'), $file);
    252 
    253     if ( ! function_exists('imagecreatefromstring') )
    254         return __('The GD image library is not installed.');
    255 
    256     // Set artificially high because GD uses uncompressed images in memory
    257     @ini_set( 'memory_limit', apply_filters( 'image_memory_limit', WP_MAX_MEMORY_LIMIT ) );
    258     $image = imagecreatefromstring( file_get_contents( $file ) );
    259 
    260     if ( !is_resource( $image ) )
    261         return sprintf(__('File “%s” is not an image.'), $file);
    262 
    263     return $image;
    264 }
    265 
    266 /**
    267239 * Calculates the new dimensions for a downsampled image.
    268240 *
     
    394366
    395367/**
    396  * Scale down an image to fit a particular size and save a new copy of the image.
    397  *
    398  * The PNG transparency will be preserved using the function, as well as the
    399  * image type. If the file going in is PNG, then the resized image is going to
    400  * be PNG. The only supported image types are PNG, GIF, and JPEG.
    401  *
    402  * Some functionality requires API to exist, so some PHP version may lose out
    403  * support. This is not the fault of WordPress (where functionality is
    404  * downgraded, not actual defects), but of your PHP version.
    405  *
    406  * @since 2.5.0
    407  *
    408  * @param string $file Image file path.
    409  * @param int $max_w Maximum width to resize to.
    410  * @param int $max_h Maximum height to resize to.
    411  * @param bool $crop Optional. Whether to crop image or resize.
    412  * @param string $suffix Optional. File suffix.
    413  * @param string $dest_path Optional. New image file path.
    414  * @param int $jpeg_quality Optional, default is 90. Image quality percentage.
    415  * @return mixed WP_Error on failure. String with new destination path.
    416  */
    417 function image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 ) {
    418 
    419     $image = wp_load_image( $file );
    420     if ( !is_resource( $image ) )
    421         return new WP_Error( 'error_loading_image', $image, $file );
    422 
    423     $size = @getimagesize( $file );
    424     if ( !$size )
    425         return new WP_Error('invalid_image', __('Could not read image size'), $file);
    426     list($orig_w, $orig_h, $orig_type) = $size;
    427 
    428     $dims = image_resize_dimensions($orig_w, $orig_h, $max_w, $max_h, $crop);
    429     if ( !$dims )
    430         return new WP_Error( 'error_getting_dimensions', __('Could not calculate resized image dimensions') );
    431     list($dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) = $dims;
    432 
    433     $newimage = wp_imagecreatetruecolor( $dst_w, $dst_h );
    434 
    435     imagecopyresampled( $newimage, $image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
    436 
    437     // convert from full colors to index colors, like original PNG.
    438     if ( IMAGETYPE_PNG == $orig_type && function_exists('imageistruecolor') && !imageistruecolor( $image ) )
    439         imagetruecolortopalette( $newimage, false, imagecolorstotal( $image ) );
    440 
    441     // we don't need the original in memory anymore
    442     imagedestroy( $image );
    443 
    444     // $suffix will be appended to the destination filename, just before the extension
    445     if ( !$suffix )
    446         $suffix = "{$dst_w}x{$dst_h}";
    447 
    448     $info = pathinfo($file);
    449     $dir = $info['dirname'];
    450     $ext = $info['extension'];
    451     $name = wp_basename($file, ".$ext");
    452 
    453     if ( !is_null($dest_path) and $_dest_path = realpath($dest_path) )
    454         $dir = $_dest_path;
    455     $destfilename = "{$dir}/{$name}-{$suffix}.{$ext}";
    456 
    457     if ( IMAGETYPE_GIF == $orig_type ) {
    458         if ( !imagegif( $newimage, $destfilename ) )
    459             return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
    460     } elseif ( IMAGETYPE_PNG == $orig_type ) {
    461         if ( !imagepng( $newimage, $destfilename ) )
    462             return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
    463     } else {
    464         // all other formats are converted to jpg
    465         if ( 'jpg' != $ext && 'jpeg' != $ext )
    466             $destfilename = "{$dir}/{$name}-{$suffix}.jpg";
    467         if ( !imagejpeg( $newimage, $destfilename, apply_filters( 'jpeg_quality', $jpeg_quality, 'image_resize' ) ) )
    468             return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
    469     }
    470 
    471     imagedestroy( $newimage );
    472 
    473     // Set correct file permissions
    474     $stat = stat( dirname( $destfilename ));
    475     $perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits
    476     @ chmod( $destfilename, $perms );
    477 
    478     return $destfilename;
    479 }
    480 
    481 /**
    482368 * Resize an image to make a thumbnail or intermediate size.
    483369 *
     
    494380 * @return bool|array False, if no image was created. Metadata array on success.
    495381 */
    496 function image_make_intermediate_size($file, $width, $height, $crop=false) {
     382function image_make_intermediate_size( $file, $width, $height, $crop = false ) {
    497383    if ( $width || $height ) {
    498         $resized_file = image_resize($file, $width, $height, $crop);
    499         if ( !is_wp_error($resized_file) && $resized_file && $info = getimagesize($resized_file) ) {
    500             $resized_file = apply_filters('image_make_intermediate_size', $resized_file);
    501             return array(
    502                 'file' => wp_basename( $resized_file ),
    503                 'width' => $info[0],
    504                 'height' => $info[1],
    505             );
     384        $editor = WP_Image_Editor::get_instance( $file );
     385
     386        if ( is_wp_error( $editor->resize( $width, $height, $crop ) ) );
     387            return false;
     388
     389        $resized_file = $editor->save();
     390
     391        if ( ! is_wp_error( $resized_file ) && $resized_file ) {
     392            unset( $resized_file['path'] );
     393            return $resized_file;
    506394        }
    507395    }
     
    1048936/**
    1049937 * Create new GD image resource with transparency support
     938 * @TODO: Deprecate if possible.
    1050939 *
    1051940 * @since 2.9.0
Note: See TracChangeset for help on using the changeset viewer.