public function execute(SpecificationInterface $spec, MediaInterface $source, $dest) { if (!$spec instanceof Animation) { throw new SpecNotSupportedException('Imagine Adapter only supports Image specs'); } if ($source->getType() !== MediaInterface::TYPE_VIDEO) { throw new SpecNotSupportedException('Imagine Adapter only supports Images'); } try { $movie = $this->container['ffmpeg.ffmpeg']->open($source->getFile()->getPathname()); $duration = $source->getDuration(); $time = $pas = Max(1, $duration / 11); $files = array(); while (ceil($time) < floor($duration)) { $files[] = $tmpFile = $this->tmpFileManager->createTemporaryFile(self::TMP_FILE_SCOPE, 'ffmpeg', 'jpg'); $frame = $movie->frame(TimeCode::fromSeconds($time)); $frame->filters()->fixDisplayRatio(); $frame->save($tmpFile); $time += $pas; } foreach ($files as $file) { $image = $this->container['imagine']->open($file); if ($spec->getWidth() && $spec->getHeight()) { $box = $this->boxFromSize($spec, $image->getSize()->getWidth(), $image->getSize()->getHeight()); if ($spec->getResizeMode() == Animation::RESIZE_MODE_OUTBOUND) { /* @var $image \Imagine\Gmagick\Image */ $image = $image->thumbnail($box, ImageInterface::THUMBNAIL_OUTBOUND); } else { $image = $image->resize($box); } } $image->save($file, array('quality' => $spec->getQuality(), 'resolution-units' => $spec->getResolutionUnit(), 'resolution-x' => $spec->getResolutionX(), 'resolution-y' => $spec->getResolutionY())); unset($image); } $image = $this->container['imagine']->open(array_shift($files)); foreach ($files as $file) { $image->layers()->add($this->container['imagine']->open($file)); } $image->save($dest, array('animated' => true, 'animated.delay' => 800, 'animated.loops' => 0)); $this->tmpFileManager->clean(self::TMP_FILE_SCOPE); } catch (FFMpegException $e) { $this->tmpFileManager->clean(self::TMP_FILE_SCOPE); throw new RuntimeException('Unable to transmute video to animation due to FFMpeg', null, $e); } catch (ImagineException $e) { $this->tmpFileManager->clean(self::TMP_FILE_SCOPE); throw new RuntimeException('Unable to transmute video to animation due to Imagine', null, $e); } catch (RuntimeException $e) { $this->tmpFileManager->clean(self::TMP_FILE_SCOPE); throw $e; } return $this; }
/** * * @return \Alchemy\Phrasea\Media\Type\Type|null */ public function getType() { switch ($this->media->getType()) { case MediaInterface::TYPE_AUDIO: return new Audio(); break; case MediaInterface::TYPE_DOCUMENT: return new Document(); break; case MediaInterface::TYPE_FLASH: return new Flash(); break; case MediaInterface::TYPE_IMAGE: return new Image(); break; case MediaInterface::TYPE_VIDEO: return new Video(); break; } return null; }
public function execute(SpecificationInterface $spec, MediaInterface $source, $dest) { if (!$spec instanceof Image) { throw new SpecNotSupportedException('Imagine Adapter only supports Image specs'); } if ($source->getType() !== MediaInterface::TYPE_IMAGE) { throw new SpecNotSupportedException('Imagine Adapter only supports Images'); } try { if (static::$lookForEmbeddedPreview) { $tmpFile = $this->extractEmbeddedImage($source->getFile()->getPathname()); if ($tmpFile instanceof MediaInterface) { $source = $tmpFile; } } if ($source->getFile()->getMimeType() === 'application/illustrator') { $tmpFile = $this->tmpFileManager->createTemporaryFile(self::TMP_FILE_SCOPE, 'gs_transcoder'); $this->container['ghostscript.transcoder']->toImage($source->getFile()->getRealPath(), $tmpFile); if (file_exists($tmpFile)) { $source = $this->container['mediavorus']->guess($tmpFile); } } elseif ($source->getFile()->getMimeType() === 'image/tiff') { $image = $this->container['imagine']->open($source->getFile()->getRealPath()); $layers = array(); foreach ($image->layers() as $layer) { $tmpFile = $this->tmpFileManager->createTemporaryFile(self::TMP_FILE_SCOPE, 'imagine-tiff-layer', pathinfo($dest, PATHINFO_EXTENSION)); $layer->save($tmpFile); $layers[] = $tmpFile; } uasort($layers, function ($layer1, $layer2) { $size1 = filesize($layer1); $size2 = filesize($layer2); if ($size1 == $size2) { return 0; } return $size1 > $size2 ? -1 : 1; }); $source = $this->container['mediavorus']->guess(array_shift($layers)); } elseif (preg_match('#(application|image)\\/([a-z0-9-_\\.]*)photoshop([a-z0-9-_\\.]*)#i', $source->getFile()->getMimeType())) { $image = $this->container['imagine']->open($source->getFile()->getRealPath()); foreach ($image->layers() as $layer) { $tmpFile = $this->tmpFileManager->createTemporaryFile(self::TMP_FILE_SCOPE, 'imagine-photoshop-layer', 'jpg'); $layer->save($tmpFile); if (file_exists($tmpFile)) { $source = $this->container['mediavorus']->guess($tmpFile); } break; } } $image = $this->container['imagine']->open($source->getFile()->getPathname()); if ($spec->getWidth() && $spec->getHeight()) { $box = $this->boxFromSize($spec, $image->getSize()->getWidth(), $image->getSize()->getHeight()); if (null !== $box) { if ($spec->getResizeMode() == Image::RESIZE_MODE_OUTBOUND) { /* @var $image \Imagine\Gmagick\Image */ $image = $image->thumbnail($box, ImageInterface::THUMBNAIL_OUTBOUND); } else { $image = $image->resize($box); } } } if (static::$autorotate && null === $spec->getRotationAngle()) { $image = $image->rotate($source->getOrientation()); } elseif (null !== ($angle = $spec->getRotationAngle())) { $image = $image->rotate($angle); } $image->usePalette($this->palette); if (true == $spec->getStrip()) { $image = $image->strip(); } $options = array('flatten' => $spec->getFlatten() && strtolower(pathinfo($dest, PATHINFO_EXTENSION)) !== 'gif', 'quality' => $spec->getQuality(), 'resolution-units' => $spec->getResolutionUnit(), 'resolution-x' => $spec->getResolutionX(), 'resolution-y' => $spec->getResolutionY()); $image->save($dest, $options); $this->tmpFileManager->clean(self::TMP_FILE_SCOPE); } catch (MediaVorusException $e) { $this->tmpFileManager->clean(self::TMP_FILE_SCOPE); throw new RuntimeException('Unable to transmute image to image due to Mediavorus', null, $e); } catch (PHPExiftoolException $e) { $this->tmpFileManager->clean(self::TMP_FILE_SCOPE); throw new RuntimeException('Unable to transmute image to image due to PHPExiftool', null, $e); } catch (ImagineException $e) { $this->tmpFileManager->clean(self::TMP_FILE_SCOPE); throw new RuntimeException('Unable to transmute image to image due to Imagine', null, $e); } catch (RuntimeException $e) { $this->tmpFileManager->clean(self::TMP_FILE_SCOPE); throw $e; } }