diff --git a/ShareX.ImageEffectsLib/Forms/ImageEffectsForm.cs b/ShareX.ImageEffectsLib/Forms/ImageEffectsForm.cs
index e683ae2e9..037d5cbff 100644
--- a/ShareX.ImageEffectsLib/Forms/ImageEffectsForm.cs
+++ b/ShareX.ImageEffectsLib/Forms/ImageEffectsForm.cs
@@ -129,6 +129,7 @@ private void AddAllEffectsToContextMenu()
typeof(Canvas),
typeof(Crop),
typeof(Flip),
+ typeof(ForceProportions),
typeof(Resize),
typeof(Rotate),
typeof(RoundedCorners),
diff --git a/ShareX.ImageEffectsLib/Manipulations/ForceProportions.cs b/ShareX.ImageEffectsLib/Manipulations/ForceProportions.cs
new file mode 100644
index 000000000..aa6a588b1
--- /dev/null
+++ b/ShareX.ImageEffectsLib/Manipulations/ForceProportions.cs
@@ -0,0 +1,122 @@
+#region License Information (GPL v3)
+
+/*
+ ShareX - A program that allows you to take screenshots and share any file type
+ Copyright (c) 2007-2020 ShareX Team
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ Optionally you can also view the license at .
+*/
+
+#endregion License Information (GPL v3)
+
+using ShareX.HelpersLib;
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Design;
+
+namespace ShareX.ImageEffectsLib
+{
+ [Description("Force Proportions")]
+ internal class ForceProportions : ImageEffect
+ {
+ private int width = 1;
+ private int height = 1;
+
+ [DefaultValue(typeof(int), "1")]
+ public int ProportionalWidth
+ {
+ get {
+ return width;
+ }
+ set
+ {
+ width = Math.Max(1, value);
+ }
+ }
+ [DefaultValue(typeof(int), "1")]
+ public int ProportionalHeight
+ {
+ get
+ {
+ return height;
+ }
+ set
+ {
+ height = Math.Max(1, value);
+ }
+ }
+
+ public enum ForceMethod
+ {
+ Grow,
+ Crop
+ }
+
+ public ForceMethod Method { get; set; } = ForceMethod.Grow;
+
+ [DefaultValue(typeof(Color), "Transparent"), Editor(typeof(MyColorEditor), typeof(UITypeEditor)), TypeConverter(typeof(MyColorConverter))]
+ public Color GrowFillColor { get; set; } = Color.FromArgb(0);
+
+ public ForceProportions()
+ {
+ this.ApplyDefaultPropertyValues();
+ }
+
+ public override Bitmap Apply(Bitmap bmp)
+ {
+ float current_ratio = bmp.Width / (float)bmp.Height;
+ float target_ratio = width / (float)height;
+
+ bool is_target_wider = target_ratio > current_ratio;
+
+ int target_width = bmp.Width;
+ int target_height = bmp.Height;
+ int margin_left = 0;
+ int margin_top = 0;
+
+ if (Method == ForceMethod.Crop)
+ {
+ if (is_target_wider)
+ {
+ target_height = (int)Math.Round(bmp.Width / target_ratio);
+ margin_top = (bmp.Height - target_height) / 2;
+ }
+ else
+ {
+ target_width = (int)Math.Round(bmp.Height * target_ratio);
+ margin_left = (bmp.Width - target_width) / 2;
+ }
+ return ImageHelpers.CropBitmap(bmp, new Rectangle(margin_left, margin_top, target_width, target_height));
+ }
+ if (Method == ForceMethod.Grow)
+ {
+ if (is_target_wider)
+ {
+ target_width = (int)Math.Round(bmp.Height * target_ratio);
+ }
+ else
+ {
+ target_height = (int)Math.Round(bmp.Width / target_ratio);
+ }
+ return ImageHelpers.ResizeImage(bmp, target_width, target_height, false, true, GrowFillColor);
+ }
+
+ return bmp;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj b/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj
index f98cde0cd..c417f20b7 100644
--- a/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj
+++ b/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj
@@ -142,6 +142,7 @@
+