WordPress.org

Make WordPress Core

Changeset 7041


Ignore:
Timestamp:
02/26/2008 06:46:03 PM (10 years ago)
Author:
ryan
Message:

image_resize() and friends from tellyworth. fixes #6005

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/image.php

    r6952 r7041  
    226226function wp_shrink_dimensions( $width, $height, $wmax = 128, $hmax = 96 ) {
    227227    return wp_constrain_dimensions( $width, $height, $wmax, $hmax );
    228 }
    229 
    230 // same as wp_shrink_dimensions, except the max parameters are optional.
    231 // if either width or height are empty, no constraint is applied on that dimension.
    232 function wp_constrain_dimensions( $current_width, $current_height, $max_width=0, $max_height=0 ) {
    233     if ( !$max_width and !$max_height )
    234         return array( $current_width, $current_height );
    235    
    236     $width_ratio = $height_ratio = 1.0;
    237    
    238     if ( $max_width > 0 && $current_width > $max_width )
    239         $width_ratio = $max_width / $current_width;
    240    
    241     if ( $max_height > 0 && $current_height > $max_height )
    242         $height_ratio = $max_height / $current_height;
    243    
    244     // the smaller ratio is the one we need to fit it to the constraining box
    245     $ratio = min( $width_ratio, $height_ratio );
    246    
    247     return array( intval($current_width * $ratio), intval($current_height * $ratio) );
    248228}
    249229
  • trunk/wp-includes/media.php

    r6974 r7041  
    9393}
    9494
     95// same as wp_shrink_dimensions, except the max parameters are optional.
     96// if either width or height are empty, no constraint is applied on that dimension.
     97function wp_constrain_dimensions( $current_width, $current_height, $max_width=0, $max_height=0 ) {
     98    if ( !$max_width and !$max_height )
     99        return array( $current_width, $current_height );
     100   
     101    $width_ratio = $height_ratio = 1.0;
     102   
     103    if ( $max_width > 0 && $current_width > $max_width )
     104        $width_ratio = $max_width / $current_width;
     105   
     106    if ( $max_height > 0 && $current_height > $max_height )
     107        $height_ratio = $max_height / $current_height;
     108   
     109    // the smaller ratio is the one we need to fit it to the constraining box
     110    $ratio = min( $width_ratio, $height_ratio );
     111   
     112    return array( intval($current_width * $ratio), intval($current_height * $ratio) );
     113}
     114
     115// calculate dimensions and coordinates for a resized image that fits within a specified width and height
     116// if $crop is true, the largest matching central portion of the image will be cropped out and resized to the required size
     117function image_resize_dimensions($orig_w, $orig_h, $dest_w, $dest_h, $crop=false) {
     118   
     119    if ($orig_w <= 0 || $orig_h <= 0)
     120        return false;
     121    // at least one of dest_w or dest_h must be specific
     122    if ($dest_w <= 0 && $dest_h <= 0)
     123        return false;
     124   
     125    if ( $crop ) {
     126        // crop the largest possible portion of the original image that we can size to $dest_w x $dest_h
     127        $aspect_ratio = $orig_w / $orig_h;
     128        $new_w = min($dest_w, $orig_w);
     129        $new_h = min($dest_h, $orig_h);
     130        if (!$new_w) {
     131            $new_w = intval($new_h * $aspect_ratio);
     132        }
     133        if (!$new_h) {
     134            $new_h = intval($new_w / $aspect_ratio);
     135        }
     136
     137        $size_ratio = max($new_w / $orig_w, $new_h / $orig_h);
     138       
     139        $crop_w = ceil($new_w / $size_ratio);
     140        $crop_h = ceil($new_h / $size_ratio);
     141
     142        $s_x = floor(($orig_w - $crop_w)/2);
     143        $s_y = floor(($orig_h - $crop_h)/2);
     144    }
     145    else {
     146        // don't crop, just resize using $dest_w x $dest_h as a maximum bounding box
     147        $crop_w = $orig_w;
     148        $crop_h = $orig_h;
     149       
     150        $s_x = 0;
     151        $s_y = 0;
     152       
     153        list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h );
     154    }
     155   
     156    // if the resulting image would be the same size or larger we don't want to resize it
     157    if ($new_w >= $orig_w && $new_h >= $orig_h)
     158        return false;
     159
     160    // the return array matches the parameters to imagecopyresampled()
     161    // int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h
     162    return array(0, 0, $s_x, $s_y, $new_w, $new_h, $crop_w, $crop_h);
     163
     164}
     165
     166// Scale down an image to fit a particular size and save a new copy of the image
     167function image_resize( $file, $max_w, $max_h, $crop=false, $suffix=null, $dest_path=null, $jpeg_quality=75) {
     168
     169    $image = wp_load_image( $file );
     170    if ( !is_resource( $image ) )
     171        return new WP_Error('error_loading_image', $image);
     172
     173    list($orig_w, $orig_h, $orig_type) = getimagesize( $file );
     174    $dims = image_resize_dimensions($orig_w, $orig_h, $max_w, $max_h, $crop);
     175    if (!$dims)
     176        return $dims;
     177    list($dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) = $dims;
     178   
     179    $newimage = imagecreatetruecolor( $dst_w, $dst_h);
     180
     181    // preserve PNG transparency
     182    if ( IMAGETYPE_PNG == $orig_type && function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) {
     183        imagealphablending( $newimage, false);
     184        imagesavealpha( $newimage, true);
     185    }
     186
     187    imagecopyresampled( $newimage, $image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
     188
     189    // we don't need the original in memory anymore
     190    imagedestroy( $image );
     191
     192    // $suffix will be appended to the destination filename, just before the extension
     193    if ( !$suffix )
     194        $suffix = "{$dst_w}x{$dst_h}";
     195
     196    $info = pathinfo($file);
     197    $dir = $info['dirname'];
     198    $ext = $info['extension'];
     199    $name = basename($file, ".{$ext}");
     200    if ( !is_null($dest_path) and $_dest_path = realpath($dest_path) )
     201        $dir = $_dest_path;
     202    $destfilename = "{$dir}/{$name}-{$suffix}.{$ext}";
     203
     204    if ( $orig_type == IMAGETYPE_GIF ) {
     205        if (!imagegif( $newimage, $destfilename ) )
     206            return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
     207    }
     208    elseif ( $orig_type == IMAGETYPE_PNG ) {
     209        if (!imagepng( $newimage, $destfilename ) )
     210            return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
     211    }
     212    else {
     213        // all other formats are converted to jpg
     214        $destfilename = "{$dir}/{$name}-{$suffix}.jpg";
     215        if (!imagejpeg( $newimage, $destfilename, $jpeg_quality ) )
     216            return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
     217    }
     218
     219    imagedestroy( $newimage );
     220
     221    // Set correct file permissions
     222    $stat = stat( dirname( $destfilename ));
     223    $perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits
     224    @ chmod( $destfilename, $perms );
     225
     226    return $destfilename;
     227}
     228
    95229?>
Note: See TracChangeset for help on using the changeset viewer.