container->get('image.factory'); // Create a working copy of the file. $files = $this->drupalGetTestFiles('image'); $file = reset($files); $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME); // Create a style. /** @var $style \Drupal\image\ImageStyleInterface */ $style = entity_create('image_style', array('name' => 'test', 'label' => 'Test')); $style->save(); $generated_uri = 'public://styles/test/public/'. \Drupal::service('file_system')->basename($original_uri); $url = $style->buildUrl($original_uri); $variables = array( '#theme' => 'image_style', '#style_name' => 'test', '#uri' => $original_uri, '#width' => 40, '#height' => 20, ); // Verify that the original image matches the hard-coded values. $image_file = $image_factory->get($original_uri); $this->assertEqual($image_file->getWidth(), $variables['#width']); $this->assertEqual($image_file->getHeight(), $variables['#height']); // Scale an image that is wider than it is high. $effect = array( 'id' => 'image_scale', 'data' => array( 'width' => 120, 'height' => 90, 'upscale' => TRUE, ), 'weight' => 0, ); $style->addImageEffect($effect); $style->save(); $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); $image_file = $image_factory->get($generated_uri); $this->assertEqual($image_file->getWidth(), 120); $this->assertEqual($image_file->getHeight(), 60); // Rotate 90 degrees anticlockwise. $effect = array( 'id' => 'image_rotate', 'data' => array( 'degrees' => -90, 'random' => FALSE, ), 'weight' => 1, ); $style->addImageEffect($effect); $style->save(); $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); $image_file = $image_factory->get($generated_uri); $this->assertEqual($image_file->getWidth(), 60); $this->assertEqual($image_file->getHeight(), 120); // Scale an image that is higher than it is wide (rotated by previous effect). $effect = array( 'id' => 'image_scale', 'data' => array( 'width' => 120, 'height' => 90, 'upscale' => TRUE, ), 'weight' => 2, ); $style->addImageEffect($effect); $style->save(); $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); $image_file = $image_factory->get($generated_uri); $this->assertEqual($image_file->getWidth(), 45); $this->assertEqual($image_file->getHeight(), 90); // Test upscale disabled. $effect = array( 'id' => 'image_scale', 'data' => array( 'width' => 400, 'height' => 200, 'upscale' => FALSE, ), 'weight' => 3, ); $style->addImageEffect($effect); $style->save(); $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); $image_file = $image_factory->get($generated_uri); $this->assertEqual($image_file->getWidth(), 45); $this->assertEqual($image_file->getHeight(), 90); // Add a desaturate effect. $effect = array( 'id' => 'image_desaturate', 'data' => array(), 'weight' => 4, ); $style->addImageEffect($effect); $style->save(); $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); $image_file = $image_factory->get($generated_uri); $this->assertEqual($image_file->getWidth(), 45); $this->assertEqual($image_file->getHeight(), 90); // Add a random rotate effect. $effect = array( 'id' => 'image_rotate', 'data' => array( 'degrees' => 180, 'random' => TRUE, ), 'weight' => 5, ); $style->addImageEffect($effect); $style->save(); $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); // Add a crop effect. $effect = array( 'id' => 'image_crop', 'data' => array( 'width' => 30, 'height' => 30, 'anchor' => 'center-center', ), 'weight' => 6, ); $style->addImageEffect($effect); $style->save(); $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); $image_file = $image_factory->get($generated_uri); $this->assertEqual($image_file->getWidth(), 30); $this->assertEqual($image_file->getHeight(), 30); // Rotate to a non-multiple of 90 degrees. $effect = array( 'id' => 'image_rotate', 'data' => array( 'degrees' => 57, 'random' => FALSE, ), 'weight' => 7, ); $effect_id = $style->addImageEffect($effect); $style->save(); $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); $effect_plugin = $style->getEffect($effect_id); $style->deleteImageEffect($effect_plugin); // Ensure that an effect can unset dimensions. $effect = array( 'id' => 'image_module_test_null', 'data' => array(), 'weight' => 8, ); $style->addImageEffect($effect); $style->save(); $this->assertEqual($this->getImageTag($variables), ''); // Test URI dependent image effect. $style = ImageStyle::create(['name' => 'test_uri', 'label' => 'Test URI']); $effect = [ 'id' => 'image_module_test_uri_dependent', 'data' => [], 'weight' => 0, ]; $style->addImageEffect($effect); $style->save(); $variables = [ '#theme' => 'image_style', '#style_name' => 'test_uri', '#uri' => $original_uri, '#width' => 40, '#height' => 20, ]; // PNG original image. Should be resized to 100x100. $generated_uri = 'public://styles/test_uri/public/'. \Drupal::service('file_system')->basename($original_uri); $url = $style->buildUrl($original_uri); $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); $image_file = $image_factory->get($generated_uri); $this->assertEqual($image_file->getWidth(), 100); $this->assertEqual($image_file->getHeight(), 100); // GIF original image. Should be resized to 50x50. $file = $files[1]; $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME); $generated_uri = 'public://styles/test_uri/public/'. \Drupal::service('file_system')->basename($original_uri); $url = $style->buildUrl($original_uri); $variables['#uri'] = $original_uri; $this->assertEqual($this->getImageTag($variables), ''); $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); $this->drupalGet($url); $this->assertResponse(200, 'Image was generated at the URL.'); $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); $image_file = $image_factory->get($generated_uri); $this->assertEqual($image_file->getWidth(), 50); $this->assertEqual($image_file->getHeight(), 50); } /** * Render an image style element. * * drupal_render() alters the passed $variables array by adding a new key * '#printed' => TRUE. This prevents next call to re-render the element. We * wrap drupal_render() in a helper protected method and pass each time a * fresh array so that $variables won't get altered and the element is * re-rendered each time. */ protected function getImageTag($variables) { return str_replace("\n", NULL, \Drupal::service('renderer')->renderRoot($variables)); } }