diff --git a/config/schema/image_effects.schema.yml b/config/schema/image_effects.schema.yml
index 2ad089e..9f0eb64 100644
--- a/config/schema/image_effects.schema.yml
+++ b/config/schema/image_effects.schema.yml
@@ -413,3 +413,11 @@ image.effect.image_effects_interlace:
     type:
       type: string
       label: 'Type'
+
+image.effect.scale_percentage:
+  type: mapping
+  label: 'Adjust interlace type'
+  mapping:
+    scale_percentage:
+      label: 'Scale Percentage'
+      type: integer
diff --git a/src/Plugin/ImageEffect/ScalePercentage.php b/src/Plugin/ImageEffect/ScalePercentage.php
new file mode 100644
index 0000000..48b0805
--- /dev/null
+++ b/src/Plugin/ImageEffect/ScalePercentage.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Drupal\image_effects\Plugin\ImageEffect;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Image\ImageInterface;
+use Drupal\image\Annotation\ImageEffect;
+use Drupal\image\ConfigurableImageEffectBase;
+
+/**
+ * Scale an image effect by a percentage.
+ *
+ * @ImageEffect(
+ *   id = "scale_percentage",
+ *   label = @Translation("Scale Percentage"),
+ *   description = @Translation("Scale an image size by a percentage.")
+ * )
+ */
+class ScalePercentage extends ConfigurableImageEffectBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applyEffect(ImageInterface $image) {
+    $scale_factor = $this->configuration['scale_percentage'] / 100;
+    $image->resize($image->getWidth() * $scale_factor, $image->getHeight() * $scale_factor);
+    return $image;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form['scale_percentage'] = [
+      '#type' => 'number',
+      '#title' => $this->t('Scale Percentage'),
+      '#description' => $this->t('The percentage to scale the image by.'),
+      '#min' => 0,
+      '#default_value' => $this->configuration['scale_percentage'],
+      '#field_suffix' => $this->t('%'),
+    ];
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $this->configuration['scale_percentage'] = $form_state->getValue('scale_percentage');
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'scale_percentage' => NULL,
+    ];
+  }
+
+}
diff --git a/tests/src/Kernel/ScalePercentageTest.php b/tests/src/Kernel/ScalePercentageTest.php
new file mode 100644
index 0000000..6f15ce0
--- /dev/null
+++ b/tests/src/Kernel/ScalePercentageTest.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Drupal\Tests\image_effects\Kernel;
+
+use Drupal\image\Entity\ImageStyle;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Test the image styles.
+ *
+ * @group image_effects
+ */
+class ScalePercentageTest extends KernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'image_effects',
+    'image',
+    'system',
+  ];
+
+  /**
+   * Test image style.
+   *
+   * @var \Drupal\image\Entity\ImageStyle
+   */
+  protected $styleName = 'test_style';
+
+  /**
+   * A test image style.
+   *
+   * @var \Drupal\image\ImageStyleInterface
+   */
+  protected $style;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('image_style');
+    $this->installConfig('system');
+
+    $this->style = ImageStyle::create([
+      'name' => $this->styleName,
+    ]);
+
+    $this->style->save();
+  }
+
+  /**
+   * Test the dimensions are reduced properly.
+   *
+   * @dataProvider scalePercentageTestCases
+   */
+  public function testScalePercentage($image, $scale_percentage, $expected_width, $expected_height) {
+    $this->style->addImageEffect([
+      'id' => 'scale_percentage',
+      'data' => [
+        'scale_percentage' => $scale_percentage,
+      ],
+    ]);
+    $this->style->save();
+
+    $derivative_uri = 'public://test-image.jpg';
+    $this->style->createDerivative(__DIR__ . '/../../images/' . $image, $derivative_uri);
+
+    // Ensure the generated image is at least half the size of the original.
+    list($final_width, $final_height) = getimagesize($derivative_uri);
+    $this->assertEquals($expected_width, $final_width);
+    $this->assertEquals($expected_height, $final_height);
+  }
+
+  /**
+   * Test cases for ::testScalePercentage.
+   */
+  public function scalePercentageTestCases() {
+    return [
+      '100% scale' => [
+        'portrait-painting.jpg',
+        100,
+        640,
+        480,
+      ],
+      '50% scale' => [
+        'portrait-painting.jpg',
+        50,
+        320,
+        240,
+      ],
+      '150% scale' => [
+        'portrait-painting.jpg',
+        150,
+        960,
+        720,
+      ],
+    ];
+  }
+
+}
