[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