mirror of
https://github.com/ShareX/ShareX.git
synced 2024-09-30 01:07:21 +13:00
Added WrapAfter option to CombineImages function
This commit is contained in:
parent
365c2120ea
commit
6af7de1a22
4 changed files with 92 additions and 61 deletions
|
@ -2100,31 +2100,101 @@ public static Bitmap LoadImageWithFileDialog(Form form = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bitmap CombineImages(List<Bitmap> images, Orientation orientation, ImageCombinerAlignment alignment = ImageCombinerAlignment.LeftOrTop,
|
public static Bitmap CombineImages(List<Bitmap> images, Orientation orientation, ImageCombinerAlignment alignment = ImageCombinerAlignment.LeftOrTop,
|
||||||
int space = 0, bool autoFillBackground = false)
|
int space = 0, int wrapAfter = 0, bool autoFillBackground = false)
|
||||||
{
|
{
|
||||||
int width, height;
|
|
||||||
int imageCount = images.Count;
|
int imageCount = images.Count;
|
||||||
int spaceSize = space * (imageCount - 1);
|
Rectangle[] imageRects = new Rectangle[imageCount];
|
||||||
|
Point position = new Point(0, 0);
|
||||||
|
int currentSize = 0;
|
||||||
|
|
||||||
if (orientation == Orientation.Horizontal)
|
for (int i = 0; i < imageCount; i++)
|
||||||
{
|
{
|
||||||
width = images.Sum(x => x.Width) + spaceSize;
|
Bitmap image = images[i];
|
||||||
height = images.Max(x => x.Height);
|
Point offset = new Point(0, 0);
|
||||||
}
|
|
||||||
else
|
if (orientation == Orientation.Horizontal)
|
||||||
{
|
{
|
||||||
width = images.Max(x => x.Width);
|
if (wrapAfter > 0)
|
||||||
height = images.Sum(x => x.Height) + spaceSize;
|
{
|
||||||
|
if (i % wrapAfter == 0)
|
||||||
|
{
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
position.X = 0;
|
||||||
|
position.Y += currentSize + space;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentSize = images.Skip(i).Take(wrapAfter).Max(x => x.Height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (i == 0)
|
||||||
|
{
|
||||||
|
currentSize = images.Max(x => x.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (alignment)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
case ImageCombinerAlignment.LeftOrTop:
|
||||||
|
offset.Y = 0;
|
||||||
|
break;
|
||||||
|
case ImageCombinerAlignment.Center:
|
||||||
|
offset.Y = (currentSize / 2) - (image.Height / 2);
|
||||||
|
break;
|
||||||
|
case ImageCombinerAlignment.RightOrBottom:
|
||||||
|
offset.Y = currentSize - image.Height;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
imageRects[i] = new Rectangle(position.X + offset.X, position.Y + offset.Y, image.Width, image.Height);
|
||||||
|
position.X += image.Width + space;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (wrapAfter > 0)
|
||||||
|
{
|
||||||
|
if (i % wrapAfter == 0)
|
||||||
|
{
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
position.X += currentSize + space;
|
||||||
|
position.Y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentSize = images.Skip(i).Take(wrapAfter).Max(x => x.Width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (i == 0)
|
||||||
|
{
|
||||||
|
currentSize = images.Max(x => x.Width);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (alignment)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
case ImageCombinerAlignment.LeftOrTop:
|
||||||
|
offset.X = 0;
|
||||||
|
break;
|
||||||
|
case ImageCombinerAlignment.Center:
|
||||||
|
offset.X = (currentSize / 2) - (image.Width / 2);
|
||||||
|
break;
|
||||||
|
case ImageCombinerAlignment.RightOrBottom:
|
||||||
|
offset.X = currentSize - image.Width;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
imageRects[i] = new Rectangle(position.X + offset.X, position.Y + offset.Y, image.Width, image.Height);
|
||||||
|
position.Y += image.Height + space;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Bitmap bmp = new Bitmap(width, height);
|
Rectangle totalImageRect = imageRects.Combine();
|
||||||
|
Bitmap bmp = new Bitmap(totalImageRect.Width, totalImageRect.Height);
|
||||||
|
|
||||||
using (Graphics g = Graphics.FromImage(bmp))
|
using (Graphics g = Graphics.FromImage(bmp))
|
||||||
{
|
{
|
||||||
g.SetHighQuality();
|
g.SetHighQuality();
|
||||||
|
|
||||||
Point position = new Point(0, 0);
|
|
||||||
|
|
||||||
for (int i = 0; i < imageCount; i++)
|
for (int i = 0; i < imageCount; i++)
|
||||||
{
|
{
|
||||||
Bitmap image = images[i];
|
Bitmap image = images[i];
|
||||||
|
@ -2135,49 +2205,7 @@ public static Bitmap CombineImages(List<Bitmap> images, Orientation orientation,
|
||||||
g.Clear(backgroundColor);
|
g.Clear(backgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle rect;
|
g.DrawImage(image, imageRects[i]);
|
||||||
Point offset = new Point(0, 0);
|
|
||||||
|
|
||||||
if (orientation == Orientation.Horizontal)
|
|
||||||
{
|
|
||||||
switch (alignment)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case ImageCombinerAlignment.LeftOrTop:
|
|
||||||
offset.Y = 0;
|
|
||||||
break;
|
|
||||||
case ImageCombinerAlignment.Center:
|
|
||||||
offset.Y = (height / 2) - (image.Height / 2);
|
|
||||||
break;
|
|
||||||
case ImageCombinerAlignment.RightOrBottom:
|
|
||||||
offset.Y = height - image.Height;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
rect = new Rectangle(position.X + offset.X, position.Y + offset.Y, image.Width, image.Height);
|
|
||||||
position.X += image.Width + space;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (alignment)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case ImageCombinerAlignment.LeftOrTop:
|
|
||||||
offset.X = 0;
|
|
||||||
break;
|
|
||||||
case ImageCombinerAlignment.Center:
|
|
||||||
offset.X = (width / 2) - (image.Width / 2);
|
|
||||||
break;
|
|
||||||
case ImageCombinerAlignment.RightOrBottom:
|
|
||||||
offset.X = width - image.Width;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
rect = new Rectangle(position.X + offset.X, position.Y + offset.Y, image.Width, image.Height);
|
|
||||||
position.Y += image.Height + space;
|
|
||||||
}
|
|
||||||
|
|
||||||
g.DrawImage(image, rect);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2185,7 +2213,7 @@ public static Bitmap CombineImages(List<Bitmap> images, Orientation orientation,
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bitmap CombineImages(IEnumerable<string> imageFiles, Orientation orientation, ImageCombinerAlignment alignment = ImageCombinerAlignment.LeftOrTop,
|
public static Bitmap CombineImages(IEnumerable<string> imageFiles, Orientation orientation, ImageCombinerAlignment alignment = ImageCombinerAlignment.LeftOrTop,
|
||||||
int space = 0, bool autoFillBackground = false)
|
int space = 0, int wrapAfter = 0, bool autoFillBackground = false)
|
||||||
{
|
{
|
||||||
List<Bitmap> images = new List<Bitmap>();
|
List<Bitmap> images = new List<Bitmap>();
|
||||||
|
|
||||||
|
@ -2203,7 +2231,7 @@ public static Bitmap CombineImages(IEnumerable<string> imageFiles, Orientation o
|
||||||
|
|
||||||
if (images.Count > 1)
|
if (images.Count > 1)
|
||||||
{
|
{
|
||||||
return CombineImages(images, orientation, alignment, space, autoFillBackground);
|
return CombineImages(images, orientation, alignment, space, wrapAfter, autoFillBackground);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
|
|
@ -180,7 +180,8 @@ private void btnCombine_Click(object sender, EventArgs e)
|
||||||
|
|
||||||
if (imageFiles.Count > 1)
|
if (imageFiles.Count > 1)
|
||||||
{
|
{
|
||||||
Bitmap output = ImageHelpers.CombineImages(imageFiles, Options.Orientation, Options.Alignment, Options.Space, Options.AutoFillBackground);
|
Bitmap output = ImageHelpers.CombineImages(imageFiles, Options.Orientation, Options.Alignment, Options.Space, Options.WrapAfter,
|
||||||
|
Options.AutoFillBackground);
|
||||||
|
|
||||||
if (output != null)
|
if (output != null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,6 +33,7 @@ public class ImageCombinerOptions
|
||||||
public Orientation Orientation { get; set; } = Orientation.Vertical;
|
public Orientation Orientation { get; set; } = Orientation.Vertical;
|
||||||
public ImageCombinerAlignment Alignment { get; set; } = ImageCombinerAlignment.LeftOrTop;
|
public ImageCombinerAlignment Alignment { get; set; } = ImageCombinerAlignment.LeftOrTop;
|
||||||
public int Space { get; set; } = 0;
|
public int Space { get; set; } = 0;
|
||||||
|
public int WrapAfter { get; set; } = 0;
|
||||||
public bool AutoFillBackground { get; set; } = true;
|
public bool AutoFillBackground { get; set; } = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -833,7 +833,8 @@ public static void CombineImages(IEnumerable<string> imageFiles, Orientation ori
|
||||||
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
|
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
|
||||||
|
|
||||||
Bitmap output = ImageHelpers.CombineImages(imageFiles, orientation, taskSettings.ToolsSettings.ImageCombinerOptions.Alignment,
|
Bitmap output = ImageHelpers.CombineImages(imageFiles, orientation, taskSettings.ToolsSettings.ImageCombinerOptions.Alignment,
|
||||||
taskSettings.ToolsSettings.ImageCombinerOptions.Space, taskSettings.ToolsSettings.ImageCombinerOptions.AutoFillBackground);
|
taskSettings.ToolsSettings.ImageCombinerOptions.Space, taskSettings.ToolsSettings.ImageCombinerOptions.WrapAfter,
|
||||||
|
taskSettings.ToolsSettings.ImageCombinerOptions.AutoFillBackground);
|
||||||
|
|
||||||
if (output != null)
|
if (output != null)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue