/** * Hydrate and render an image variation with parent data. * * You can use this to create a variation with a source image * * @param Image $parent * @param ImageVariation $variation * * @return ImageVariation * * @throws BadImageException * @throws ImageManagerException */ protected function hydrateVariation(Image $parent, ImageVariation &$variation) { if (!$parent->isHydrated()) { throw new ImageManagerException('Parent: ' . self::ERR_NOT_HYDRATED); } $quality = $variation->getQuality() ?: 90; if ($quality < 1) { $quality = 1; } elseif ($quality > 100) { $quality = 100; } $variation->setData(null); $input = $parent->getData(); foreach ($this->encoders as $encoder) { if ($encoder->supports($input)) { $encoder->setData($input); $variation->setData($encoder->createVariation($variation->getFormat(), $quality, $variation->getDimensions(), $variation->getCropDimensions())); $encoder->setData(null); break; } } if (!$variation->getData()) { throw new NoSupportedEncoderException('There is no known encoder for this data type'); } return $variation; }
/** * @medium */ public function testVariationLocalCreate() { $fn = __DIR__ . '/../Resources/image.png'; $im = new ImageManager(new Filesystem(new LocalAdapter(static::$tmp_dir . 'remote'))); $source = $im->loadFromFile($fn, self::TEST_KEY); // Create and render the variation $var = $im->createVariation($source, ImageFormat::JPEG(), 50); $this->assertFalse($var->isPersistent()); $this->assertTrue($var->isHydrated()); // Test the local save $im->save($var, self::$tmp_dir . 'local/variation.jpg'); $this->assertFalse($var->isPersistent()); $im->push($var); $this->assertTrue($var->isPersistent()); // Test the pull $var_pull = new ImageVariation(self::TEST_KEY, ImageFormat::JPEG(), 50); $this->assertFalse($var_pull->isPersistent()); $this->assertFalse($var_pull->isHydrated()); $im->pull($var_pull); $this->assertTrue($var_pull->isPersistent()); $this->assertTrue($var_pull->isHydrated()); $im->save($var_pull, self::$tmp_dir . 'local/variation_pulled.jpg'); // Test an auto-pull $var_autopull = new ImageVariation(self::TEST_KEY, ImageFormat::JPEG(), 50); $this->assertFalse($var_autopull->isPersistent()); $this->assertFalse($var_autopull->isHydrated()); $im->save($var_autopull, self::$tmp_dir . 'local/variation_autopulled.jpg'); // Image data should be identical - no loss $md5_a = md5_file(self::$tmp_dir . 'local/variation.jpg'); $md5_b = md5_file(self::$tmp_dir . 'local/variation_pulled.jpg'); $md5_c = md5_file(self::$tmp_dir . 'local/variation_autopulled.jpg'); $this->assertEquals($md5_a, $md5_b); $this->assertEquals($md5_a, $md5_c); }