Advertisements

image_get_intermediate_size

Definition:
function image_get_intermediate_size($post_id, $size='thumbnail') {}

Retrieve the image’s intermediate size (resized) path, width, and height.
The $size parameter can be an array with the width and height respectively. If the size matches the ‘sizes’ metadata array for width and height, then it will be used. If there is no direct match, then the nearest image size larger than the specified size will be used. If nothing is found, then the function will break out and return false.

Parameters

  • int $post_id: Attachment ID for image.
  • array|string $size: Optional, default is ‘thumbnail’. Size of image, either array or string.

Return values

returns:False on failure or array of file path, width, and height on success.

Source code

function image_get_intermediate_size($post_id, $size='thumbnail') {

	if ( !is_array( $imagedata = wp_get_attachment_metadata( $post_id ) ) )

		return false;



	// get the best one for a specified set of dimensions

	if ( is_array($size) && !empty($imagedata['sizes']) ) {

		foreach ( $imagedata['sizes'] as $_size => $data ) {

			// already cropped to width or height; so use this size

			if ( ( $data['width'] == $size[0] && $data['height'] <= $size[1] ) || ( $data['height'] == $size[1] && $data['width'] <= $size[0] ) ) {

				$file = $data['file'];

				list($width, $height) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );

				return compact( 'file', 'width', 'height' );

			}

			// add to lookup table: area => size

			$areas[$data['width'] * $data['height']] = $_size;

		}

		if ( !$size || !empty($areas) ) {

			// find for the smallest image not smaller than the desired size

			ksort($areas);

			foreach ( $areas as $_size ) {

				$data = $imagedata['sizes'][$_size];

				if ( $data['width'] >= $size[0] || $data['height'] >= $size[1] ) {

					// Skip images with unexpectedly divergent aspect ratios (crops)

					// First, we calculate what size the original image would be if constrained to a box the size of the current image in the loop

					$maybe_cropped = image_resize_dimensions($imagedata['width'], $imagedata['height'], $data['width'], $data['height'], false );

					// If the size doesn't match within one pixel, then it is of a different aspect ratio, so we skip it, unless it's the thumbnail size

					if ( 'thumbnail' != $_size && ( !$maybe_cropped || ( $maybe_cropped[4] != $data['width'] && $maybe_cropped[4] + 1 != $data['width'] ) || ( $maybe_cropped[5] != $data['height'] && $maybe_cropped[5] + 1 != $data['height'] ) ) )

						continue;

					// If we're still here, then we're going to use this size

					$file = $data['file'];

					list($width, $height) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );

					return compact( 'file', 'width', 'height' );

				}

			}

		}

	}



	if ( is_array($size) || empty($size) || empty($imagedata['sizes'][$size]) )

		return false;



	$data = $imagedata['sizes'][$size];

	// include the full filesystem path of the intermediate file

	if ( empty($data['path']) && !empty($data['file']) ) {

		$file_url = wp_get_attachment_url($post_id);

		$data['path'] = path_join( dirname($imagedata['file']), $data['file'] );

		$data['url'] = path_join( dirname($file_url), $data['file'] );

	}

	return $data;

}

1989

Advertisements

No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: