All pastes #134653 Raw Edit

Miscellany

public text v1 · immutable
#134653 ·published 2006-08-16 13:45 UTC
rendered paste body
/**
 * Given the filepath of a full sized image bank image, return the 
 * filepath to the thumbnail'd version. This function will first create
 * the thumbnail if it doesn't yet exist. The second argument, height,
 * can be used to proportionally scale the image to a certain size.
 *
 * @param $filepath
 *   The filepath to a full sized image.
 * @param $height
 *   Defaults to 90; the height of the thumbnail.
 * @return $thumbnailpath
 *   The path to the (possibly newly generated) thumbnail.
 */
function cnucustom_imagebank_thumbnail($filepath, $height = 90) {
  $filepath_parts = explode('/', $filepath); $filename = array_pop($filepath_parts);
  $thumbnailpath = implode('/', $filepath_parts)."/thumbnails/$height-$filename";

  // with no thumbnail, we'll create our own. we only know what we want
  // the height to be, so we figure out the proper width proportion first.
  if (!file_exists($thumbnailpath)) {
    $info = image_get_info($filepath);
    $ratio_change = $height / $info['height'];
    $width = $info['width'] * $ratio_change;
    image_resize($filepath, $thumbnailpath, $width, $height);
  }

  return $thumbnailpath;
}

/**
 * Given the filepath of a full sized image bank image, return the filepath
 * to a resized/cropped version as determined by the width and height. This
 * function will create the resized version if it does not already exist.
 *
 * @param $filepath
 *   The filepath to a full sized image.
 * @param $final_width
 *   Defaults to 25; the width of the thumbnail.
 * @param $final_height
 *   Defaults to 25; the height of the thumbnail.
 * @return $thumbnailpath
 *   The path to the (possibly newly generated) image.
 */
function cnucustom_imagebank_resize($filepath, $final_width = 80, $final_height = 80) {
  $filepath_parts = explode('/', $filepath); $filename = array_pop($filepath_parts);
  $thumbnailpath = implode('/', $filepath_parts)."/thumbnails/${final_width}x${final_height}-$filename";

  // ar == aspect ratio.
  if (!file_exists($thumbnailpath)) {
    $source_info = image_get_info($filepath);
    $source_ar   = $source_info['width'] / $source_info['height'];
    if ($source_info['width'] > $final_width && $source_info['height'] > $final_height) {
      // only proceed if we've got a big enough source file... don't stretch a tiny one.
      $final_ar = $final_width / $final_height;
      if ($source_ar > $final_ar) {
        $width = round($source_info['width'] / ($source_ar / $final_ar));
        // start crop at halfway point to retain center.
        $x = round(($source_info['width'] - $width) / 2); 
        $y = 0; $height = $source_info['height'];
        image_crop($filepath, $thumbnailpath, $x, $y, $width, $height);
      } elseif ($source_ar < $final_ar) {
        $height = round($source_info['height'] * ($source_ar / $final_ar));
        // start crop at halfway point to retain center.
        $y = round(($source_info['height'] - $height) / 2);
        $x = 0; $width = $source_info['width'];
        image_crop($filepath, $thumbnailpath, $x, $y, $width, $height);
      }
      // resize cropped image (with right AR) to correct size.
      image_resize($thumbnailpath, $thumbnailpath, $final_width, $final_height);
    }
    else { // image was too small to crop, so just resize down.
      image_resize($filepath, $thumbnailpath, $final_width, $final_height);
    }
  }

  return $thumbnailpath;
}

/**
 * Given a uid and a count, returns an array of that many image bank images
 * ready for display in HTML, with thumbnails and links to the full node.
 */
function cnucustom_imagebank_recent($uid, $count = 6) {
  $results = db_query_range('SELECT nid FROM {node} n WHERE type = "%s" AND uid = %d ORDER BY n.created DESC', 'content-image_bank', $uid, 0, $count);
  $images = array(); while ($result = db_fetch_object($results)) { // grab six images by default since that maps to a 2x3 matrix on member pages.
    $node  = node_load($result->nid); node_view(&$node); $image = array_shift($node->files);
    $images[] = l(theme('image', cnucustom_imagebank_resize($image->filepath), $node->field_image_caption[0]['view'], $node->field_image_caption[0]['view']), 'node/'.$node->nid, NULL
, NULL, NULL, NULL, TRUE);
  } return $images;
}