Updated the vertical and horizontal crop to not first make new images, but use DrawImage directly.

This commit is contained in:
Robin Krom 2022-03-05 00:03:15 +01:00
commit 1ee90b8c29
No known key found for this signature in database
GPG key ID: BCC01364F1371490

View file

@ -1091,14 +1091,14 @@ namespace Greenshot.Editor.Drawing
// special condition for vertical // special condition for vertical
if(cropMode == CropContainer.CropModes.Vertical && cropRectangle.Width == Image.Width) if(cropMode == CropContainer.CropModes.Vertical && cropRectangle.Width == Image.Width)
{ {
//crop out the hole imgage is not allowed //crop out the hole image is not allowed
return false; return false;
} }
// special condition for vertical // special condition for vertical
if (cropMode == CropContainer.CropModes.Horizontal && cropRectangle.Height == Image.Height) if (cropMode == CropContainer.CropModes.Horizontal && cropRectangle.Height == Image.Height)
{ {
//crop out the hole imgage is not allowed //crop out the hole image is not allowed
return false; return false;
} }
@ -1251,20 +1251,21 @@ namespace Greenshot.Editor.Drawing
var bottomRectangle = new Rectangle(0, cropRectangle.Top + cropRectangle.Height, Image.Size.Width, Image.Size.Height - cropRectangle.Top - cropRectangle.Height); var bottomRectangle = new Rectangle(0, cropRectangle.Top + cropRectangle.Height, Image.Size.Width, Image.Size.Height - cropRectangle.Top - cropRectangle.Height);
Bitmap newImage; Bitmap newImage;
var imageParts = new List<Bitmap>();
// Make sure we have information, this this fails
try try
{ {
newImage = new Bitmap(Image.Size.Width, Image.Size.Height - cropRectangle.Height); newImage = new Bitmap(Image.Size.Width, Image.Size.Height - cropRectangle.Height);
using var graphics = Graphics.FromImage(newImage);
var insertPositionTop = 0;
if (topRectangle.Height > 0) if (topRectangle.Height > 0)
{ {
imageParts.Add( ImageHelper.CloneArea(Image, topRectangle, PixelFormat.DontCare)); graphics.DrawImage(Image, new Rectangle(0, insertPositionTop, topRectangle.Width, topRectangle.Height), topRectangle, GraphicsUnit.Pixel);
insertPositionTop += topRectangle.Height;
} }
if (bottomRectangle.Height > 0) if (bottomRectangle.Height > 0)
{ {
imageParts.Add(ImageHelper.CloneArea(Image, bottomRectangle, PixelFormat.DontCare)); graphics.DrawImage(Image, new Rectangle(0, insertPositionTop, bottomRectangle.Width, bottomRectangle.Height), bottomRectangle, GraphicsUnit.Pixel);
} }
} }
catch (Exception ex) catch (Exception ex)
@ -1275,16 +1276,6 @@ namespace Greenshot.Editor.Drawing
ex.Data.Add("Pixelformat", Image.PixelFormat); ex.Data.Add("Pixelformat", Image.PixelFormat);
throw; throw;
} }
using Graphics g = Graphics.FromImage(newImage);
var insertPositionTop = 0;
foreach (var image in imageParts)
{
g.DrawImage(image, new Point(0, insertPositionTop));
insertPositionTop += image.Height;
image.Dispose();
}
var matrix = new Matrix(); var matrix = new Matrix();
matrix.Translate(0, -(cropRectangle.Top + cropRectangle.Height), MatrixOrder.Append); matrix.Translate(0, -(cropRectangle.Top + cropRectangle.Height), MatrixOrder.Append);
// Make undoable // Make undoable
@ -1317,20 +1308,22 @@ namespace Greenshot.Editor.Drawing
var leftRectangle = new Rectangle(0, 0, cropRectangle.Left, Image.Size.Height); var leftRectangle = new Rectangle(0, 0, cropRectangle.Left, Image.Size.Height);
var rightRectangle = new Rectangle(cropRectangle.Left + cropRectangle.Width, 0, Image.Size.Width - cropRectangle.Width - cropRectangle.Left, Image.Size.Height); var rightRectangle = new Rectangle(cropRectangle.Left + cropRectangle.Width, 0, Image.Size.Width - cropRectangle.Width - cropRectangle.Left, Image.Size.Height);
Bitmap newImage; Bitmap newImage;
var imageParts = new List<Bitmap>();
// Make sure we have information, this this fails
try try
{ {
newImage = new Bitmap(Image.Size.Width - cropRectangle.Width, Image.Size.Height); newImage = new Bitmap(Image.Size.Width - cropRectangle.Width, Image.Size.Height);
using var graphics = Graphics.FromImage(newImage);
var insertPositionLeft = 0;
if (leftRectangle.Width > 0) if (leftRectangle.Width > 0)
{ {
imageParts.Add(ImageHelper.CloneArea(Image, leftRectangle, PixelFormat.DontCare)); graphics.DrawImage(Image, new Rectangle(insertPositionLeft, 0, leftRectangle.Width, leftRectangle.Height), leftRectangle , GraphicsUnit.Pixel);
insertPositionLeft += leftRectangle.Width;
} }
if (rightRectangle.Width > 0) if (rightRectangle.Width > 0)
{ {
imageParts.Add(ImageHelper.CloneArea(Image, rightRectangle, PixelFormat.DontCare)); graphics.DrawImage(Image, new Rectangle(insertPositionLeft, 0, rightRectangle.Width, rightRectangle.Height), rightRectangle, GraphicsUnit.Pixel);
} }
} }
catch (Exception ex) catch (Exception ex)
@ -1341,16 +1334,6 @@ namespace Greenshot.Editor.Drawing
ex.Data.Add("Pixelformat", Image.PixelFormat); ex.Data.Add("Pixelformat", Image.PixelFormat);
throw; throw;
} }
using Graphics g = Graphics.FromImage(newImage);
var insertPositionLeft = 0;
foreach (var image in imageParts)
{
g.DrawImage(image, new Point(insertPositionLeft, 0));
insertPositionLeft += image.Width;
image.Dispose();
}
var matrix = new Matrix(); var matrix = new Matrix();
matrix.Translate(-cropRectangle.Left - cropRectangle.Width, 0, MatrixOrder.Append); matrix.Translate(-cropRectangle.Left - cropRectangle.Width, 0, MatrixOrder.Append);
// Make undoable // Make undoable