[wp-trac] [WordPress Trac] #15311: dynamic image resize (on the fly) using already available functions

WordPress Trac wp-trac at lists.automattic.com
Wed Nov 3 20:18:44 UTC 2010


#15311: dynamic image resize (on the fly) using already available functions
-------------------------+--------------------------------------------------
 Reporter:  vteixeira    |       Owner:                 
     Type:  enhancement  |      Status:  new            
 Priority:  normal       |   Milestone:  Awaiting Review
Component:  Media        |     Version:  3.1            
 Severity:  normal       |    Keywords:                 
-------------------------+--------------------------------------------------
 The lack of a dynamic resize function in WordPress forces theme developers
 to register lots of image sizes for their themes to use.

 One of the problems with this approach is that the server becomes full of
 image files that will be never used.

 Another problem is that when someone changes their theme the image sizes
 simply doesn't match, forcing people to use a plugin to regenerate all
 image files, and once again lots of those files will never be used.

 So theme developers right now are using some sort of image resizing script
 like timthumb that works outside of wp. I think it has many drawbacks
 comparing to a native implementation.

 So I made a function that uses WordPress native image handling
 capabilities to resize and save those resized images for future use.

 I use this for attached images as well as standalone files such as custom
 fields and other images.

 What I want here is just to share my solution, and maybe we can someday
 put something like this into core (actually something better then this):

 {{{
 /*
  * Resize images dynamically using wp built in functions
  * Victor Teixeira
  *
  * php 5.2+
  *
  * Exemple use:
  *
  * <?php
  * $thumb = get_post_thumbnail_id();
  * $image = vt_resize( $thumb,'' , 140, 110, true );
  * ?>
  * <img src="<?php echo $image[url]; ?>" width="<?php echo $image[width];
 ?>" height="<?php echo $image[height]; ?>" />
  *
  * @param int $attach_id
  * @param string $img_url
  * @param int $width
  * @param int $height
  * @param bool $crop
  * @return array
  */
 function vt_resize( $attach_id = null, $img_url = null, $width, $height,
 $crop = false ) {

         // this is an attachment, so we have the ID
         if ( $attach_id ) {

                 $image_src = wp_get_attachment_image_src( $attach_id,
 'full' );
                 $file_path = get_attached_file( $attach_id );

         // this is not an attachment, let's use the image url
         } else if ( $img_url ) {

                 $file_path = parse_url( $img_url );
                 $file_path = ltrim( $file_path['path'], '/' );
                 //$file_path = rtrim( ABSPATH, '/' ).$file_path['path'];

                 $orig_size = getimagesize( $file_path );

                 $image_src[0] = $img_url;
                 $image_src[1] = $orig_size[0];
                 $image_src[2] = $orig_size[1];
         }

         $file_info = pathinfo( $file_path );
         $extension = '.'. $file_info['extension'];

         // the image path without the extension
         $no_ext_path = $file_info['dirname'].'/'.$file_info['filename'];

         $cropped_img_path =
 $no_ext_path.'-'.$width.'x'.$height.$extension;

         // checking if the file size is larger than the target size
         // if it is smaller or the same size, stop right here and return
         if ( $image_src[1] > $width || $image_src[2] > $height ) {

                 // the file is larger, check if the resized version
 already exists (for crop = true but will also work for crop = false if the
 sizes match)
                 if ( file_exists( $cropped_img_path ) ) {

                         $cropped_img_url = str_replace( basename(
 $image_src[0] ), basename( $cropped_img_path ), $image_src[0] );

                         $vt_image = array (
                                 'url' => $cropped_img_url,
                                 'width' => $width,
                                 'height' => $height
                         );

                         return $vt_image;
                 }

                 // crop = false
                 if ( $crop == false ) {

                         // calculate the size proportionaly
                         $proportional_size = wp_constrain_dimensions(
 $image_src[1], $image_src[2], $width, $height );
                         $resized_img_path =
 $no_ext_path.'-'.$proportional_size[0].'x'.$proportional_size[1].$extension;

                         // checking if the file already exists
                         if ( file_exists( $resized_img_path ) ) {

                                 $resized_img_url = str_replace( basename(
 $image_src[0] ), basename( $resized_img_path ), $image_src[0] );

                                 $vt_image = array (
                                         'url' => $resized_img_url,
                                         'width' => $new_img_size[0],
                                         'height' => $new_img_size[1]
                                 );

                                 return $vt_image;
                         }
                 }

                 // no cached files - let's finally resize it
                 $new_img_path = image_resize( $file_path, $width, $height,
 $crop );
                 $new_img_size = getimagesize( $new_img_path );
                 $new_img = str_replace( basename( $image_src[0] ),
 basename( $new_img_path ), $image_src[0] );

                 // resized output
                 $vt_image = array (
                         'url' => $new_img,
                         'width' => $new_img_size[0],
                         'height' => $new_img_size[1]
                 );

                 return $vt_image;
         }

         // default output - without resizing
         $vt_image = array (
                 'url' => $image_src[0],
                 'width' => $image_src[1],
                 'height' => $image_src[2]
         );

         return $vt_image;
 }
 }}}

-- 
Ticket URL: <http://core.trac.wordpress.org/ticket/15311>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software


More information about the wp-trac mailing list