/** * Create a thumbnail for the given file with the given width and height. * * @param string $name name of the image to create the thumbnail of * @param string $fullPath absolute path to the image to create the thumbnail of * @param int $width width to resize to (Set to 0 to preserve aspect ratio) * @param int $height height to resize to (Set to 0 to preserve aspect ratio) * @param bool $exact This will preserve aspect ratio by using a crop after the resize * @return string path where the thumbnail was created * @throws phMagickException * @throws Zend_Exception */ public function createThumbnailFromPath($name, $fullPath, $width, $height, $exact = true) { /** @var SettingModel $settingModel */ $settingModel = MidasLoader::loadModel('Setting'); $provider = $settingModel->getValueByName(MIDAS_THUMBNAILCREATOR_PROVIDER_KEY, $this->moduleName); $useThumbnailer = $settingModel->getValueByName(MIDAS_THUMBNAILCREATOR_USE_THUMBNAILER_KEY, $this->moduleName); $preprocessedFormats = array('mha', 'nrrd'); $ext = strtolower(substr(strrchr($name, '.'), 1)); if ($useThumbnailer === 1 && $provider === 'phmagick' && in_array($ext, $preprocessedFormats)) { // pre-process the file to get a temporary JPEG file and then feed it to ImageMagick later. $preprocessedJpeg = $this->preprocessByThumbnailer($name, $fullPath); if (isset($preprocessedJpeg) && file_exists($preprocessedJpeg)) { $fullPath = $preprocessedJpeg; $ext = strtolower(substr(strrchr($preprocessedJpeg, '.'), 1)); } } // create destination $tmpPath = UtilityComponent::getTempDirectory('thumbnailcreator'); $format = $settingModel->getValueByName(MIDAS_THUMBNAILCREATOR_FORMAT_KEY, $this->moduleName); if ($format === 'jpeg') { $format = MIDAS_THUMBNAILCREATOR_FORMAT_JPG; } /** @var RandomComponent $randomComponent */ $randomComponent = MidasLoader::loadComponent('Random'); $destination = $tmpPath . '/' . $randomComponent->generateInt() . '.' . $format; while (file_exists($destination)) { $destination = $tmpPath . '/' . $randomComponent->generateInt() . '.' . $format; } $pathThumbnail = $destination; if ($provider === 'phmagick') { $imageMagickPath = $settingModel->getValueByName(MIDAS_THUMBNAILCREATOR_IMAGE_MAGICK_KEY, $this->moduleName); switch ($ext) { case 'pdf': case 'mpg': case 'mpeg': case 'mp4': case 'm4v': case 'avi': case 'mov': case 'flv': case 'rm': // If this is a video, we have to have the file extension, so symlink it if (function_exists('symlink') && symlink($fullPath, $fullPath . '.' . $ext)) { $p = new phmagick('', $pathThumbnail); $p->setImageMagickPath($imageMagickPath); $p->acquireFrame($fullPath . '.' . $ext, 0); if ($exact) { // preserve aspect ratio by performing a crop after the resize $p->resizeExactly($width, $height); } else { $p->resize($width, $height); } unlink($fullPath . '.' . $ext); } break; default: // Otherwise it is just a normal image $p = new phmagick($fullPath, $pathThumbnail); $p->setImageMagickPath($imageMagickPath); if ($exact) { // preserve aspect ratio by performing a crop after the resize $p->resizeExactly($width, $height); } else { $p->resize($width, $height); } break; } // delete temporary file generated in pre-process step if (isset($preprocessedJpeg) && file_exists($preprocessedJpeg)) { unlink($preprocessedJpeg); } } elseif ($provider === MIDAS_THUMBNAILCREATOR_PROVIDER_GD || $provider === MIDAS_THUMBNAILCREATOR_PROVIDER_IMAGICK) { try { $manager = new \Intervention\Image\ImageManager(array('driver' => $provider)); $image = $manager->make($fullPath); if ($height === 0) { $image->widen($width); } elseif ($width === 0) { $image->heighten($height); } else { $image->resize($width, $height); } $image->save($pathThumbnail); } catch (\RuntimeException $exception) { Zend_Registry::get('logger')->err($exception->getMessage()); throw new Zend_Exception('Thumbnail creation failed'); } } else { throw new Zend_Exception('No thumbnail provider has been selected'); } return $pathThumbnail; }
function getMime(phmagick $p, $file = '') { if ($file == '') { $file = $p->getSource(); } $info = getimagesize($file); return $info["mime"]; }
/** * Draws an image with the submited string, usefull for water marks * * @param $text String - the text to draw an image from * @param $format phMagickTextObject - the text configuration */ function fromString(phmagick $p, $text = '', phMagickTextObject $format = null) { if (is_null($format)) { $format = new phMagickTextObject(); } $cmd = $p->getBinary('convert'); if ($format->background !== false) { $cmd .= ' -background "' . $format->background . '"'; } if ($format->color !== false) { $cmd .= ' -fill "' . $format->color . '"'; } if ($format->font !== false) { $cmd .= ' -font ' . $format->font; } if ($format->fontSize !== false) { $cmd .= ' -pointsize ' . $format->fontSize; } if ($format->pText != '' && ($text = '')) { $text = $format->pText; } $cmd .= ' label:"' . $text . '"'; $cmd .= ' "' . $p->getDestination() . '"'; $p->execute($cmd); $p->setSource($p->getDestination()); $p->setHistory($p->getDestination()); return $p; }
/** * Attempts to create an image(s) from a File (PDF & Avi are supported on most systems) * it grabs the first frame / page from the source file * @param $file String - the path to the file * @param $ext String - the extention of the generated image */ function acquireFrame(phmagick $p, $file, $frames = 0) { // $cmd = 'echo "" | '; //just a workarround for videos, // imagemagick first converts all frames then deletes all but the first $cmd = $p->getBinary('convert'); $cmd .= ' "' . $file . '"[' . $frames . ']'; $cmd .= ' "' . $p->getDestination() . '"'; $p->execute($cmd); $p->setSource($p->getDestination()); $p->setHistory($p->getDestination()); return $p; }
/** * * @param $width Integer * @param $height Integer * @param $top Integer - The Y coordinate for the left corner of the crop rectangule * @param $left Integer - The X coordinate for the left corner of the crop rectangule * @param $gravity phMagickGravity - The initial placement of the crop rectangule * @return unknown_type */ function crop(phmagick $p, $width, $height, $top = 0, $left = 0, $gravity = 'center') { $cmd = $p->getBinary('convert'); $cmd .= ' ' . $p->getSource(); if ($gravity != '' || $gravity != phMagickGravity::None) { $cmd .= ' -gravity ' . $gravity; } $cmd .= ' -crop ' . (int) $width . 'x' . (int) $height; $cmd .= '+' . $left . '+' . $top; $cmd .= ' ' . $p->getDestination(); $p->execute($cmd); $p->setSource($p->getDestination()); $p->setHistory($p->getDestination()); return $p; }
/** * Flips the image horizonaly and verticaly * @return unknown_type */ function reflection(phmagick $p, $size = 60, $transparency = 50) { $p->requirePlugin('info'); $source = $p->getSource(); //invert image $this->flipVertical($p); //crop it to $size% list($w, $h) = $p->getInfo($p->getDestination()); $p->crop($w, $h * ($size / 100), 0, 0, phMagickGravity::None); //make a image fade to transparent $cmd = $p->getBinary('convert'); $cmd .= ' "' . $p->getSource() . '"'; $cmd .= ' ( -size ' . $w . 'x' . $h * ($size / 100) . ' gradient: ) '; $cmd .= ' +matte -compose copy_opacity -composite '; $cmd .= ' "' . $p->getDestination() . '"'; $p->execute($cmd); //apply desired transparency, by creating a transparent image and merge the mirros image on to it with the desired transparency $file = dirname($p->getDestination()) . '/' . uniqid() . '.png'; $cmd = $p->getBinary('convert'); $cmd .= ' -size ' . $w . 'x' . $h * ($size / 100) . ' xc:none '; $cmd .= ' "' . $file . '"'; $p->execute($cmd); $cmd = $p->getBinary('composite'); $cmd .= ' -dissolve ' . $transparency; $cmd .= ' "' . $p->getDestination() . '"'; $cmd .= ' ' . $file; $cmd .= ' "' . $p->getDestination() . '"'; $p->execute($cmd); unlink($file); //append the source and the relfex $cmd = $p->getBinary('convert'); $cmd .= ' "' . $source . '"'; $cmd .= ' "' . $p->getDestination() . '"'; $cmd .= ' -append '; $cmd .= ' "' . $p->getDestination() . '"'; $p->execute($cmd); $p->setSource($p->getDestination()); $p->setHistory($p->getDestination()); return $p; }
/** * Creates a thumbnail of an image, if it doesn't exits * * * @param String $imageUrl - The image Url * @param Mixed $width - String / Integer * @param Mixed $height - String / Integer * @param boolean: False: resizes the image to the exact porportions (aspect ratio not preserved). True: preserves aspect ratio, only resises if image is bigger than specified measures * * @return String - the thumbnail URL */ function onTheFly(phmagick $p, $imageUrl, $width, $height, $exactDimentions = false, $webPath = '', $physicalPath = '') { //convert web path to physical $basePath = str_replace($webPath, $physicalPath, dirname($imageUrl)); $sourceFile = $basePath . '/' . basename($imageUrl); //naming the new thumbnail $thumbnailFile = $basePath . '/' . $width . '_' . $height . '_' . basename($imageUrl); $P->setSource($sourceFile); $p->setDestination($thumbnailFile); if (!file_exists($thumbnailFile)) { $p->resize($p, $width, $height, $exactDimentions); } if (!file_exists($thumbnailFile)) { //if there was an error, just use original file $thumbnailFile = $sourceFile; } //returning the thumbnail url return str_replace($physicalPath, $webPath, $thumbnailFile); }
/** * tries to resize an image to the exact size wile mantaining aspect ratio, * the image will be croped to fit the measures * @param $width * @param $height */ function resizeExactly(phmagick $p, $width, $height) { //requires Crop plugin //requires dimensions plugin $p->requirePlugin('crop'); $p->requirePlugin('info'); list($w, $h) = $p->getInfo($p->getSource()); if ($w > $h) { $h = $height; $w = 0; } else { $h = 0; $w = $width; } $p->resize($w, $h)->crop($width, $height); }
function edges(phmagick $p, $amount = 10) { $cmd = $p->getBinary('convert'); $cmd .= ' -adaptive-sharpen 2x' . $amount; $cmd .= ' -background "none" "' . $p->getSource() . '"'; $cmd .= ' "' . $p->getDestination() . '"'; $p->execute($cmd); $p->setSource($p->getDestination()); $p->setHistory($p->getDestination()); return $p; }
function save(phmagick $p) { return $p->convert($p); }
function convert(phmagick $p) { $cmd = $p->getBinary('convert'); $cmd .= ' -quality ' . $p->getImageQuality(); $cmd .= ' "' . $p->getSource() . '" "' . $p->getDestination() . '"'; $p->execute($cmd); $p->setSource($p->getDestination()); $p->setHistory($p->getDestination()); return $p; }
function autoLevels(phmagick $p) { $cmd = $p->getBinary('convert'); $cmd .= ' -normalize '; $cmd .= ' -background "none" "' . $p->getSource() . '"'; $cmd .= ' "' . $p->getDestination() . '"'; $p->execute($cmd); $p->setSource($p->getDestination()); $p->setHistory($p->getDestination()); return $p; }
function border(phmagick $p, $borderColor = "#000", $borderSize = "1") { $cmd = $p->getBinary('convert'); $cmd .= ' "' . $p->getSource() . '"'; $cmd .= ' -bordercolor "' . $borderColor . '" -border ' . $borderSize; $cmd .= ' "' . $p->getDestination() . '"'; $ret = $p->execute($cmd); $p->setSource($p->getDestination()); $p->setHistory($p->getDestination()); return $p; }