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;
 }
示例#2
0
 /**
  *
  * @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;
 }
示例#3
0
 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;
     }
 }