0byt3m1n1
Path:
/
data
/
applications
/
aps.bak
/
concrete5
/
5.6.0.2-2
/
standard
/
htdocs
/
concrete
/
core
/
helpers
/
[
Home
]
File: image.php
<?php /** * @package Helpers * @category Concrete * @author Andrew Embler <andrew@concrete5.org> * @copyright Copyright (c) 2003-2008 Concrete5. (http://www.concrete5.org) * @license http://www.concrete5.org/license/ MIT License */ /** * Functions useful for working with images. * @package Helpers * @category Concrete * @author Andrew Embler <andrew@concrete5.org> * @copyright Copyright (c) 2003-2008 Concrete5. (http://www.concrete5.org) * @license http://www.concrete5.org/license/ MIT License * Now includes cropping functionality (thanks to Jordan Lev and Kirk Roberts) */ defined('C5_EXECUTE') or die("Access Denied."); class Concrete5_Helper_Image { /** * Creates a new image given an original path, a new path, a target width and height. * Optionally crops image to exactly match given width and height. * @params string $originalPath, string $newpath, int $width, int $height, bool $crop * @return void */ public function create($originalPath, $newPath, $width, $height, $crop = false) { // first, we grab the original image. We shouldn't ever get to this function unless the image is valid $imageSize = @getimagesize($originalPath); $oWidth = $imageSize[0]; $oHeight = $imageSize[1]; $finalWidth = 0; //For cropping, this is really "scale to width before chopping extra height" $finalHeight = 0; //For cropping, this is really "scale to height before chopping extra width" $do_crop_x = false; $do_crop_y = false; $crop_src_x = 0; $crop_src_y = 0; // first, if what we're uploading is actually smaller than width and height, we do nothing if ($oWidth < $width && $oHeight < $height) { $finalWidth = $oWidth; $finalHeight = $oHeight; $width = $oWidth; $height = $oHeight; } else if ($crop && ($height >= $oHeight && $width <= $oWidth)) { //crop to width only -- don't scale anything $finalWidth = $oWidth; $finalHeight = $oHeight; $height = $oHeight; $do_crop_x = true; } else if ($crop && ($width >= $oWidth && $height <= $oHeight)) { //crop to height only -- don't scale anything $finalHeight = $oHeight; $finalWidth = $oWidth; $width = $oWidth; $do_crop_y = true; } else { // otherwise, we do some complicated stuff // first, we divide original width and height by new width and height, and find which difference is greater $wDiff = $oWidth / $width; $hDiff = ($height != 0 ? $oHeight / $height : 0); if (!$crop && ($wDiff > $hDiff)) { //no cropping, just resize down based on target width $finalWidth = $width; $finalHeight = ($wDiff != 0 ? $oHeight / $wDiff : 0); } else if (!$crop) { //no cropping, just resize down based on target height $finalWidth = ($hDiff != 0 ? $oWidth / $hDiff : 0); $finalHeight = $height; } else if ($crop && ($wDiff > $hDiff)) { //resize down to target height, THEN crop off extra width $finalWidth = ($hDiff != 0 ? $oWidth / $hDiff : 0); $finalHeight = $height; $do_crop_x = true; } else if ($crop) { //resize down to target width, THEN crop off extra height $finalWidth = $width; $finalHeight = ($wDiff != 0 ? $oHeight / $wDiff : 0); $do_crop_y = true; } } //Calculate cropping to center image if ($do_crop_x) { /* //Get half the difference between scaled width and target width, // and crop by starting the copy that many pixels over from the left side of the source (scaled) image. $nudge = ($width / 10); //I have *no* idea why the width isn't centering exactly -- this seems to fix it though. $crop_src_x = ($finalWidth / 2.00) - ($width / 2.00) + $nudge; */ $crop_src_x = round(($oWidth - ($width * $oHeight / $height)) * 0.5); } if ($do_crop_y) { /* //Calculate cropping... //Get half the difference between scaled height and target height, // and crop by starting the copy that many pixels down from the top of the source (scaled) image. $crop_src_y = ($finalHeight / 2.00) - ($height / 2.00); */ $crop_src_y = round(($oHeight - ($height * $oWidth / $width)) * 0.5); } //create "canvas" to put new resized and/or cropped image into if ($crop) { $image = @imageCreateTrueColor($width, $height); } else { $image = @imageCreateTrueColor($finalWidth, $finalHeight); } $im = false; switch($imageSize[2]) { case IMAGETYPE_GIF: $im = @imageCreateFromGIF($originalPath); break; case IMAGETYPE_JPEG: $im = @imageCreateFromJPEG($originalPath); break; case IMAGETYPE_PNG: $im = @imageCreateFromPNG($originalPath); break; } if ($im) { // Better transparency - thanks for the ideas and some code from mediumexposure.com if (($imageSize[2] == IMAGETYPE_GIF) || ($imageSize[2] == IMAGETYPE_PNG)) { $trnprt_indx = imagecolortransparent($im); // If we have a specific transparent color if ($trnprt_indx >= 0 && $trnprt_indx < imagecolorstotal($im)) { // Get the original image's transparent color's RGB values $trnprt_color = imagecolorsforindex($im, $trnprt_indx); // Allocate the same color in the new image resource $trnprt_indx = imagecolorallocate($image, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']); // Completely fill the background of the new image with allocated color. imagefill($image, 0, 0, $trnprt_indx); // Set the background color for new image to transparent imagecolortransparent($image, $trnprt_indx); } else if ($imageSize[2] == IMAGETYPE_PNG) { // Turn off transparency blending (temporarily) imagealphablending($image, false); // Create a new transparent color for image $color = imagecolorallocatealpha($image, 0, 0, 0, 127); // Completely fill the background of the new image with allocated color. imagefill($image, 0, 0, $color); // Restore transparency blending imagesavealpha($image, true); } } $res = @imageCopyResampled($image, $im, 0, 0, $crop_src_x, $crop_src_y, $finalWidth, $finalHeight, $oWidth, $oHeight); if ($res) { switch($imageSize[2]) { case IMAGETYPE_GIF: $res2 = imageGIF($image, $newPath); break; case IMAGETYPE_JPEG: $compression = defined('AL_THUMBNAIL_JPEG_COMPRESSION') ? AL_THUMBNAIL_JPEG_COMPRESSION : 80; $res2 = imageJPEG($image, $newPath, $compression); break; case IMAGETYPE_PNG: $res2 = imagePNG($image, $newPath); break; } } } @chmod($newPath, FILE_PERMISSIONS_MODE); } /** * Returns a path to the specified item, resized and/or cropped to meet max width and height. $obj can either be * a string (path) or a file object. * Returns an object with the following properties: src, width, height * @param mixed $obj * @param int $maxWidth * @param int $maxHeight * @param bool $crop */ public function getThumbnail($obj, $maxWidth, $maxHeight, $crop = false) { $fID = false; if ($obj instanceof File) { $path = $obj->getPath(); $fID = $obj->getFileID(); } else { $path = $obj; } $fh = Loader::helper('file'); $prefix = ($crop ? 'cropped:' : ''); //Name cropped images different from resized images so they don't get mixed up in the cache if (file_exists($path) && $fID) { $filename = md5($prefix . $path . ':' . $maxWidth . ':' . $maxHeight . ':' . filemtime($path)) . '_f' . $fID . '.' . $fh->getExtension($path); } else if (file_exists($path)){ $filename = md5($prefix . $path . ':' . $maxWidth . ':' . $maxHeight . ':' . filemtime($path)) . '.' . $fh->getExtension($path); } else if ($fID){ // This may be redundant - don't know it can actually ever occur $filename = md5($prefix . $path . ':' . $maxWidth . ':' . $maxHeight . ':') . '_f' . $fID . '.' . $fh->getExtension($path); } else { $filename = md5($prefix . $path . ':' . $maxWidth . ':' . $maxHeight . ':') . '.' . $fh->getExtension($path); } if (!file_exists(DIR_FILES_CACHE . '/' . $filename)) { // create image there $this->create($path, DIR_FILES_CACHE . '/' . $filename, $maxWidth, $maxHeight, $crop); } $src = REL_DIR_FILES_CACHE . '/' . $filename; $abspath = DIR_FILES_CACHE . '/' . $filename; $thumb = new stdClass; if (isset($abspath) && file_exists($abspath)) { $thumb->src = $src; $dimensions = getimagesize($abspath); $thumb->width = $dimensions[0]; $thumb->height = $dimensions[1]; return $thumb; } } /** * Runs getThumbnail on the path, and then prints it out as an XHTML image */ public function outputThumbnail($obj, $maxWidth, $maxHeight, $alt = null, $return = false, $crop = false) { $thumb = $this->getThumbnail($obj, $maxWidth, $maxHeight, $crop); $html = '<img class="ccm-output-thumbnail" alt="' . $alt . '" src="' . $thumb->src . '" width="' . $thumb->width . '" height="' . $thumb->height . '" />'; if ($return) { return $html; } else { print $html; } } public function output($obj, $alt = null, $return = false) { $s = @getimagesize($obj->getPath()); $html = '<img class="ccm-output-image" alt="' . $alt . '" src="' . $obj->getRelativePath() . '" width="' . $s[0] . '" height="' . $s[1] . '" />'; if ($return) { return $html; } else { print $html; } } }