diff --git a/core/modules/image/image.admin.inc b/core/modules/image/image.admin.inc
index 4ec432f..c986980 100644
--- a/core/modules/image/image.admin.inc
+++ b/core/modules/image/image.admin.inc
@@ -53,7 +53,7 @@ function template_preprocess_image_style_preview(&$variables) {
   $preview_file = $style->buildUri($original_path);
   // Create derivative if necessary.
   if (!file_exists($preview_file)) {
-    $style->createDerivative($original_path, $preview_file);
+    $style->createDerivativeFromImage($original_image, $preview_file);
   }
   $preview_image = $image_factory->get($preview_file);
   $variables['derivative'] = array(
diff --git a/core/modules/image/src/Entity/ImageStyle.php b/core/modules/image/src/Entity/ImageStyle.php
index 5811c0e..946ffe0 100644
--- a/core/modules/image/src/Entity/ImageStyle.php
+++ b/core/modules/image/src/Entity/ImageStyle.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Config\Entity\ThirdPartySettingsTrait;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityWithPluginCollectionInterface;
+use Drupal\Core\Image\ImageInterface;
 use Drupal\Core\Routing\RequestHelper;
 use Drupal\Core\Site\Settings;
 use Drupal\image\ImageEffectPluginCollection;
@@ -271,6 +272,14 @@ public function flush($path = NULL) {
    * {@inheritdoc}
    */
   public function createDerivative($original_uri, $derivative_uri) {
+    $image = \Drupal::service('image.factory')->get($original_uri);
+    return $this->createDerivativeFromImage($image, $derivative_uri);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function createDerivativeFromImage(ImageInterface $image, $derivative_uri) {
     // Get the folder for the final location of this style.
     $directory = drupal_dirname($derivative_uri);
 
@@ -280,7 +289,6 @@ public function createDerivative($original_uri, $derivative_uri) {
       return FALSE;
     }
 
-    $image = \Drupal::service('image.factory')->get($original_uri);
     if (!$image->isValid()) {
       return FALSE;
     }
diff --git a/core/modules/image/src/ImageStyleInterface.php b/core/modules/image/src/ImageStyleInterface.php
index 6701d6f..53bc42a 100644
--- a/core/modules/image/src/ImageStyleInterface.php
+++ b/core/modules/image/src/ImageStyleInterface.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
 use Drupal\Core\Config\Entity\ThirdPartySettingsInterface;
+use Drupal\Core\Image\ImageInterface;
 
 /**
  * Provides an interface defining an image style entity.
@@ -101,7 +102,7 @@ public function getPathToken($uri);
   public function flush($path = NULL);
 
   /**
-   * Creates a new image derivative based on this image style.
+   * Creates a new image derivative from a source image file.
    *
    * Generates an image derivative applying all image effects and saving the
    * resulting image.
@@ -118,6 +119,22 @@ public function flush($path = NULL);
   public function createDerivative($original_uri, $derivative_uri);
 
   /**
+   * Creates a new image derivative from a source Image object.
+   *
+   * Generates an image derivative applying all image effects and saving the
+   * resulting image.
+   *
+   * @param \Drupal\Core\Image\ImageInterface $image
+   *   An Image object.
+   * @param string $derivative_uri
+   *   Derivative image file URI.
+   *
+   * @return bool
+   *   TRUE if an image derivative was generated, FALSE otherwise.
+   */
+  public function createDerivativeFromImage(ImageInterface $image, $derivative_uri);
+
+  /**
    * Determines the dimensions of this image style.
    *
    * Stores the dimensions of this image style into $dimensions associative
diff --git a/core/modules/image/src/Tests/ImageAdminStylesTest.php b/core/modules/image/src/Tests/ImageAdminStylesTest.php
index b84c87d..00ddc7d 100644
--- a/core/modules/image/src/Tests/ImageAdminStylesTest.php
+++ b/core/modules/image/src/Tests/ImageAdminStylesTest.php
@@ -390,8 +390,9 @@ public function testFlushUserInterface() {
     // Create an image to make sure it gets flushed.
     $files = $this->drupalGetTestFiles('image');
     $image_uri = $files[0]->uri;
+    $image = \Drupal::service('image.factory')->get($image_uri);
     $derivative_uri = $style->buildUri($image_uri);
-    $this->assertTrue($style->createDerivative($image_uri, $derivative_uri));
+    $this->assertTrue($style->createDerivativeFromImage($image, $derivative_uri));
     $this->assertEqual($this->getImageCount($style), 1);
 
     // Go to image styles list page and check if the flush operation link
