diff --git a/core/lib/Drupal/Core/Image/Image.php b/core/lib/Drupal/Core/Image/Image.php
index 7a64355..6abb320 100644
--- a/core/lib/Drupal/Core/Image/Image.php
+++ b/core/lib/Drupal/Core/Image/Image.php
@@ -74,14 +74,7 @@ public function __construct($source, ImageToolkitInterface $toolkit) {
   /**
    * {@inheritdoc}
    */
-  public function isSupported() {
-    return in_array($this->getType(), $this->toolkit->supportedTypes());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isExisting() {
+  public function isValid() {
     $this->processInfo();
     return $this->processed;
   }
diff --git a/core/lib/Drupal/Core/Image/ImageFactory.php b/core/lib/Drupal/Core/Image/ImageFactory.php
index 3bff021..7d64816 100644
--- a/core/lib/Drupal/Core/Image/ImageFactory.php
+++ b/core/lib/Drupal/Core/Image/ImageFactory.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Image;
 
+use Drupal\Component\Utility\Unicode;
 use Drupal\Core\ImageToolkit\ImageToolkitManager;
 
 /**
@@ -80,6 +81,26 @@ public function get($source, $toolkit_id = NULL) {
   }
 
   /**
+   * Returns the supported image file extensions.
+   *
+   * @param string $toolkit_id
+   *   (Optional) The image toolkit ID to use for checking.
+   *
+   * @return array
+   *   An array of supported image file extensions (e.g. png/jpeg/gif).
+   */
+  public function getSupportedExtensions($toolkit_id = NULL) {
+    $toolkit_id = $this->resolveToolkitId($toolkit_id);
+    $definition = $this->toolkitManager->getDefinition($toolkit_id);
+    $supported_types = $definition['class']::supportedTypes();
+    $extensions = array();
+    foreach ($supported_types as $image_type) {
+      $extensions[] = Unicode::strtolower(image_type_to_extension($image_type, FALSE));
+    }
+    return $extensions;
+  }
+
+  /**
    * Resolves a toolkit ID.
    *
    * @param string $toolkit_id
diff --git a/core/lib/Drupal/Core/Image/ImageInterface.php b/core/lib/Drupal/Core/Image/ImageInterface.php
index bf782a7..5ea3c38 100644
--- a/core/lib/Drupal/Core/Image/ImageInterface.php
+++ b/core/lib/Drupal/Core/Image/ImageInterface.php
@@ -13,20 +13,12 @@
 interface ImageInterface {
 
   /**
-   * Checks if the image format is supported.
+   * Checks if the image is valid.
    *
    * @return bool
-   *   Returns TRUE if the image format is supported by the toolkit.
+   *   TRUE if the image objects contains a valid image, FALSE otherwise.
    */
-  public function isSupported();
-
-  /**
-   * Checks if the image is existing.
-   *
-   * @return bool
-   *   TRUE if the image exists and is a valid image, FALSE otherwise.
-   */
-  public function isExisting();
+  public function isValid();
 
   /**
    * Returns the height of the image.
diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index 67e5452..424b50e 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -391,7 +391,7 @@ function file_validate_size(File $file, $file_limit = 0, $user_limit = 0) {
 }
 
 /**
- * Checks that the file is recognized by Image::getInfo() as an image.
+ * Checks that the file is recognized by Image::processInfo() as an image.
  *
  * @param \Drupal\file\File $file
  *   A file entity.
@@ -404,14 +404,9 @@ function file_validate_size(File $file, $file_limit = 0, $user_limit = 0) {
 function file_validate_is_image(File $file) {
   $errors = array();
 
-  $image = \Drupal::service('image.factory')->get($file->getFileUri());
-  if (!$image->isSupported()) {
-    $toolkit = \Drupal::service('image.toolkit.manager')->getDefaultToolkit();
-    $extensions = array();
-    foreach ($toolkit->supportedTypes() as $image_type) {
-      $extensions[] = Unicode::strtoupper(image_type_to_extension($image_type));
-    }
-    $errors[] = t('Image type not supported. Allowed types: @types.', array('@types' => implode(', ', $extensions)));
+  $image_factory = \Drupal::service('image.factory');
+  if (!$image_factory->get($file->getFileUri())->isValid()) {
+    $errors[] = t('Image type not supported. Allowed types: %types', array('%types' => implode(' ', $image_factory->getSupportedExtensions())));
   }
 
   return $errors;
@@ -446,21 +441,19 @@ function file_validate_image_resolution(File $file, $maximum_dimensions = 0, $mi
   // Check first that the file is an image.
   $image_factory = \Drupal::service('image.factory');
   $image = $image_factory->get($file->getFileUri());
-  if ($image->isSupported()) {
+  if ($image->isValid()) {
     if ($maximum_dimensions) {
       // Check that it is smaller than the given dimensions.
       list($width, $height) = explode('x', $maximum_dimensions);
       if ($image->getWidth() > $width || $image->getHeight() > $height) {
         // Try to resize the image to fit the dimensions.
-        $image = $image_factory->get($file->getFileUri());
-        if ($image->isExisting()) {
-          $image->scale($width, $height);
+        if ($image->scale($width, $height)) {
           $image->save();
           $file->filesize = $image->getFileSize();
           drupal_set_message(t('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', array('%dimensions' => $maximum_dimensions)));
         }
         else {
-          $errors[] = t('The image is too large; the maximum dimensions are %dimensions pixels.', array('%dimensions' => $maximum_dimensions));
+          $errors[] = t('The image exceeds the maximum allowed dimensions and an attempt to resize it failed.');
         }
       }
     }
@@ -473,6 +466,9 @@ function file_validate_image_resolution(File $file, $maximum_dimensions = 0, $mi
       }
     }
   }
+  else {
+    $errors[] = t('Image type not supported. Allowed types: %types', array('%types' => implode(' ', $image_factory->getSupportedExtensions())));
+  }
 
   return $errors;
 }
diff --git a/core/modules/file/lib/Drupal/file/Tests/ValidatorTest.php b/core/modules/file/lib/Drupal/file/Tests/ValidatorTest.php
index d545ec5..906431c 100644
--- a/core/modules/file/lib/Drupal/file/Tests/ValidatorTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/ValidatorTest.php
@@ -91,6 +91,12 @@ function testFileValidateImageResolution() {
       $this->assertTrue($image->getWidth() <= 10, 'Image scaled to correct width.', 'File');
       $this->assertTrue($image->getHeight() <= 5, 'Image scaled to correct height.', 'File');
 
+      // Once again, now with negative width and height to force an error.
+      copy('core/misc/druplicon.png', 'temporary://druplicon.png');
+      $this->image->setFileUri('temporary://druplicon.png');
+      $errors = file_validate_image_resolution($this->image, '-10x-5');
+      $this->assertEqual(count($errors), 1, 'An error reported for an oversized image that can not be scaled down.', 'File');
+
       drupal_unlink('temporary://druplicon.png');
     }
     else {
diff --git a/core/modules/image/image.module b/core/modules/image/image.module
index c1420c1..9112ff2 100644
--- a/core/modules/image/image.module
+++ b/core/modules/image/image.module
@@ -201,7 +201,7 @@ function image_file_download($uri) {
 
     // Check that the file exists and is an image.
     $image = \Drupal::service('image.factory')->get($uri);
-    if ($image->isSupported()) {
+    if ($image->isValid()) {
       // Check the permissions of the original to grant access to this image.
       $headers = \Drupal::moduleHandler()->invokeAll('file_download', array($original_uri));
       // Confirm there's at least one module granting access and none denying access.
diff --git a/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php b/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
index 1b3c8db..8c2ed67 100644
--- a/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
+++ b/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
@@ -278,7 +278,7 @@ public function createDerivative($original_uri, $derivative_uri) {
     }
 
     $image = \Drupal::service('image.factory')->get($original_uri);
-    if (!$image->isExisting()) {
+    if (!$image->isValid()) {
       return FALSE;
     }
 
diff --git a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php
index 5442d17..c4d10df 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php
@@ -290,7 +290,7 @@ public function preSave() {
     // Determine the dimensions if necessary.
     if (empty($width) || empty($height)) {
       $image = \Drupal::service('image.factory')->get($this->entity->getFileUri());
-      if ($image->isSupported()) {
+      if ($image->isValid()) {
         $this->width = $image->getWidth();
         $this->height =$image->getHeight();
       }
diff --git a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldWidget/ImageWidget.php b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldWidget/ImageWidget.php
index cbb5c54..5712963 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldWidget/ImageWidget.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldWidget/ImageWidget.php
@@ -160,7 +160,7 @@ public static function process($element, &$form_state, $form) {
       }
       else {
         $image = \Drupal::service('image.factory')->get($file->getFileUri());
-        if ($image->isExisting()) {
+        if ($image->isValid()) {
           $variables['width'] = $image->getWidth();
           $variables['height'] = $image->getHeight();
         }
diff --git a/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php b/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
index b6ce30c..6f8fc32 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
@@ -86,6 +86,10 @@ public function resize(ImageInterface $image, $width, $height) {
     $width = (int) round($width);
     $height = (int) round($height);
 
+    if ($width < 0 || $height < 0) {
+      return FALSE;
+    }
+
     $res = $this->createTmp($image->getType(), $width, $height);
 
     if (!imagecopyresampled($res, $this->getResource(), 0, 0, 0, 0, $width, $height, $this->getWidth($image), $this->getHeight($image))) {
@@ -159,6 +163,10 @@ public function crop(ImageInterface $image, $x, $y, $width, $height) {
     $width = (int) round($width);
     $height = (int) round($height);
 
+    if ($width < 0 || $height < 0) {
+      return FALSE;
+    }
+
     $res = $this->createTmp($image->getType(), $width, $height);
 
     if (!imagecopyresampled($res, $this->getResource(), 0, 0, $x, $y, $width, $height, $width, $height)) {
diff --git a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTestBase.php b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTestBase.php
index 846e6e5..32dfeb3 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTestBase.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTestBase.php
@@ -68,7 +68,7 @@ function setUp() {
    */
   protected function getImage() {
     $image = $this->imageFactory->get($this->file, 'test');
-    $this->assertTrue($image->isExisting(), 'Image was loaded.');
+    $this->assertTrue($image->isValid(), 'Image was loaded.');
     return $image;
   }
 
diff --git a/core/tests/Drupal/Tests/Core/Image/ImageTest.php b/core/tests/Drupal/Tests/Core/Image/ImageTest.php
index 43a8740..56f613e 100644
--- a/core/tests/Drupal/Tests/Core/Image/ImageTest.php
+++ b/core/tests/Drupal/Tests/Core/Image/ImageTest.php
@@ -102,10 +102,10 @@ public function testGetMimeType() {
   }
 
   /**
-   * Tests \Drupal\Core\Image\Image::isExisting().
+   * Tests \Drupal\Core\Image\Image::isValid().
    */
-  public function testIsExisting() {
-    $this->assertTrue($this->image->isExisting());
+  public function testIsValid() {
+    $this->assertTrue($this->image->isValid());
     $this->assertTrue(is_readable($this->image->getSource()));
   }
 
@@ -178,7 +178,7 @@ public function testProcessInfoFails() {
     $toolkit = $this->getToolkitMock();
     $image = new Image('magic-foobars.png', $toolkit);
 
-    $this->assertFalse($image->isExisting());
+    $this->assertFalse($image->isValid());
   }
 
   /**
