fixed #4655: Added image alignment option to image combiner tool

This commit is contained in:
Jaex 2020-03-23 23:44:50 +03:00
parent 335972455a
commit 2066f0def0
6 changed files with 165 additions and 52 deletions

View file

@ -183,4 +183,11 @@ public enum HotkeyStatus
Failed,
NotConfigured
}
public enum ImageCombinerAlignment
{
LeftOrTop,
Center,
RightOrBottom
}
}

View file

@ -1727,11 +1727,12 @@ public static Bitmap LoadImageWithFileDialog()
return null;
}
public static Bitmap CombineImages(IEnumerable<Image> images, Orientation orientation = Orientation.Vertical, int space = 0)
public static Bitmap CombineImages(IEnumerable<Image> images, Orientation orientation = Orientation.Vertical,
ImageCombinerAlignment alignment = ImageCombinerAlignment.LeftOrTop, int space = 0)
{
int width, height;
int spaceSize = space * (images.Count() - 1);
int imageCount = images.Count();
int spaceSize = space * (imageCount - 1);
if (orientation == Orientation.Vertical)
{
@ -1757,12 +1758,40 @@ public static Bitmap CombineImages(IEnumerable<Image> images, Orientation orient
if (orientation == Orientation.Vertical)
{
rect = new Rectangle(0, position, image.Width, image.Height);
int x;
switch (alignment)
{
default:
case ImageCombinerAlignment.LeftOrTop:
x = 0;
break;
case ImageCombinerAlignment.Center:
x = width / 2 - image.Width / 2;
break;
case ImageCombinerAlignment.RightOrBottom:
x = width - image.Width;
break;
}
rect = new Rectangle(x, position, image.Width, image.Height);
position += image.Height + space;
}
else
{
rect = new Rectangle(position, 0, image.Width, image.Height);
int y;
switch (alignment)
{
default:
case ImageCombinerAlignment.LeftOrTop:
y = 0;
break;
case ImageCombinerAlignment.Center:
y = height / 2 - image.Height / 2;
break;
case ImageCombinerAlignment.RightOrBottom:
y = height - image.Height;
break;
}
rect = new Rectangle(position, y, image.Width, image.Height);
position += image.Width + space;
}

View file

@ -41,6 +41,8 @@ private void InitializeComponent()
this.lblOrientation = new System.Windows.Forms.Label();
this.cbOrientation = new System.Windows.Forms.ComboBox();
this.lblSpacePixel = new System.Windows.Forms.Label();
this.lblImageAlignment = new System.Windows.Forms.Label();
this.cbAlignment = new System.Windows.Forms.ComboBox();
((System.ComponentModel.ISupportInitialize)(this.nudSpace)).BeginInit();
this.SuspendLayout();
//
@ -76,12 +78,13 @@ private void InitializeComponent()
//
this.lvImages.AllowDrop = true;
this.lvImages.AllowItemDrag = true;
resources.ApplyResources(this.lvImages, "lvImages");
this.lvImages.AutoFillColumn = true;
this.lvImages.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.chFilepath});
this.lvImages.FullRowSelect = true;
this.lvImages.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
this.lvImages.HideSelection = false;
resources.ApplyResources(this.lvImages, "lvImages");
this.lvImages.Name = "lvImages";
this.lvImages.UseCompatibleStateImageBehavior = false;
this.lvImages.View = System.Windows.Forms.View.Details;
@ -122,9 +125,9 @@ private void InitializeComponent()
//
// cbOrientation
//
resources.ApplyResources(this.cbOrientation, "cbOrientation");
this.cbOrientation.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbOrientation.FormattingEnabled = true;
resources.ApplyResources(this.cbOrientation, "cbOrientation");
this.cbOrientation.Name = "cbOrientation";
this.cbOrientation.SelectedIndexChanged += new System.EventHandler(this.cbOrientation_SelectedIndexChanged);
//
@ -133,6 +136,19 @@ private void InitializeComponent()
resources.ApplyResources(this.lblSpacePixel, "lblSpacePixel");
this.lblSpacePixel.Name = "lblSpacePixel";
//
// lblImageAlignment
//
resources.ApplyResources(this.lblImageAlignment, "lblImageAlignment");
this.lblImageAlignment.Name = "lblImageAlignment";
//
// cbAlignment
//
this.cbAlignment.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbAlignment.FormattingEnabled = true;
resources.ApplyResources(this.cbAlignment, "cbAlignment");
this.cbAlignment.Name = "cbAlignment";
this.cbAlignment.SelectedIndexChanged += new System.EventHandler(this.cbAlignment_SelectedIndexChanged);
//
// ImageCombinerForm
//
this.AcceptButton = this.btnCombine;
@ -140,6 +156,8 @@ private void InitializeComponent()
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Window;
this.Controls.Add(this.cbAlignment);
this.Controls.Add(this.lblImageAlignment);
this.Controls.Add(this.lblSpacePixel);
this.Controls.Add(this.cbOrientation);
this.Controls.Add(this.lblOrientation);
@ -174,5 +192,7 @@ private void InitializeComponent()
private System.Windows.Forms.ComboBox cbOrientation;
private System.Windows.Forms.ColumnHeader chFilepath;
private System.Windows.Forms.Label lblSpacePixel;
private System.Windows.Forms.Label lblImageAlignment;
private System.Windows.Forms.ComboBox cbAlignment;
}
}

View file

@ -47,9 +47,31 @@ public ImageCombinerForm(ImageCombinerOptions options)
cbOrientation.Items.AddRange(Enum.GetNames(typeof(Orientation)));
cbOrientation.SelectedIndex = (int)Options.Orientation;
UpdateAlignmentComboBox();
nudSpace.SetValue(Options.Space);
}
private void UpdateAlignmentComboBox()
{
cbAlignment.Items.Clear();
// TODO: Translate
if (Options.Orientation == Orientation.Horizontal)
{
cbAlignment.Items.Add("Top");
cbAlignment.Items.Add("Center");
cbAlignment.Items.Add("Bottom");
}
else
{
cbAlignment.Items.Add("Left");
cbAlignment.Items.Add("Center");
cbAlignment.Items.Add("Right");
}
cbAlignment.SelectedIndex = (int)Options.Alignment;
}
public ImageCombinerForm(ImageCombinerOptions options, IEnumerable<string> imageFiles) : this(options)
{
if (imageFiles != null)
@ -104,6 +126,12 @@ private void btnMoveDown_Click(object sender, EventArgs e)
private void cbOrientation_SelectedIndexChanged(object sender, EventArgs e)
{
Options.Orientation = (Orientation)cbOrientation.SelectedIndex;
UpdateAlignmentComboBox();
}
private void cbAlignment_SelectedIndexChanged(object sender, EventArgs e)
{
Options.Alignment = (ImageCombinerAlignment)cbAlignment.SelectedIndex;
}
private void nudSpace_ValueChanged(object sender, EventArgs e)
@ -136,7 +164,7 @@ private void btnCombine_Click(object sender, EventArgs e)
if (images.Count > 1)
{
Bitmap output = ImageHelpers.CombineImages(images, Options.Orientation, Options.Space);
Bitmap output = ImageHelpers.CombineImages(images, Options.Orientation, Options.Alignment, Options.Space);
OnProcessRequested(output);
}

View file

@ -141,7 +141,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;btnAdd.ZOrder" xml:space="preserve">
<value>10</value>
<value>12</value>
</data>
<data name="btnRemove.Location" type="System.Drawing.Point, System.Drawing">
<value>136, 8</value>
@ -165,7 +165,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;btnRemove.ZOrder" xml:space="preserve">
<value>9</value>
<value>11</value>
</data>
<data name="btnMoveUp.Location" type="System.Drawing.Point, System.Drawing">
<value>264, 8</value>
@ -189,7 +189,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;btnMoveUp.ZOrder" xml:space="preserve">
<value>8</value>
<value>10</value>
</data>
<data name="btnMoveDown.Location" type="System.Drawing.Point, System.Drawing">
<value>392, 8</value>
@ -213,11 +213,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;btnMoveDown.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="lvImages.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
<value>9</value>
</data>
<data name="chFilepath.Text" xml:space="preserve">
<value>Image file path</value>
@ -238,25 +234,22 @@
<value>lvImages</value>
</data>
<data name="&gt;&gt;lvImages.Type" xml:space="preserve">
<value>ShareX.HelpersLib.MyListView, ShareX.HelpersLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</value>
<value>ShareX.HelpersLib.MyListView, ShareX.HelpersLib, Version=13.1.1.0, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;lvImages.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;lvImages.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="btnCombine.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
<value>8</value>
</data>
<data name="btnCombine.Location" type="System.Drawing.Point, System.Drawing">
<value>8, 472</value>
<value>8, 496</value>
</data>
<data name="btnCombine.Size" type="System.Drawing.Size, System.Drawing">
<value>504, 31</value>
</data>
<data name="btnCombine.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
<value>12</value>
</data>
<data name="btnCombine.Text" xml:space="preserve">
<value>Combine images and save/upload depending on after capture settings</value>
@ -271,22 +264,19 @@
<value>$this</value>
</data>
<data name="&gt;&gt;btnCombine.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="lblSpace.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
<value>7</value>
</data>
<data name="lblSpace.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblSpace.Location" type="System.Drawing.Point, System.Drawing">
<value>8, 448</value>
<value>8, 472</value>
</data>
<data name="lblSpace.Size" type="System.Drawing.Size, System.Drawing">
<value>121, 13</value>
</data>
<data name="lblSpace.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
<value>9</value>
</data>
<data name="lblSpace.Text" xml:space="preserve">
<value>Space between images:</value>
@ -301,20 +291,18 @@
<value>$this</value>
</data>
<data name="&gt;&gt;lblSpace.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="nudSpace.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
<value>6</value>
</data>
<data name="nudSpace.Location" type="System.Drawing.Point, System.Drawing">
<value>200, 444</value>
<value>200, 468</value>
</data>
<data name="nudSpace.Size" type="System.Drawing.Size, System.Drawing">
<value>64, 20</value>
</data>
<data name="nudSpace.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
<value>10</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="nudSpace.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
@ -328,10 +316,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;nudSpace.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="lblOrientation.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
<value>5</value>
</data>
<data name="lblOrientation.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -343,7 +328,7 @@
<value>103, 13</value>
</data>
<data name="lblOrientation.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
<value>5</value>
</data>
<data name="lblOrientation.Text" xml:space="preserve">
<value>Combine orientation:</value>
@ -358,10 +343,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;lblOrientation.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="cbOrientation.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
<value>4</value>
</data>
<data name="cbOrientation.Location" type="System.Drawing.Point, System.Drawing">
<value>200, 420</value>
@ -370,7 +352,7 @@
<value>121, 21</value>
</data>
<data name="cbOrientation.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
<value>6</value>
</data>
<data name="&gt;&gt;cbOrientation.Name" xml:space="preserve">
<value>cbOrientation</value>
@ -382,22 +364,19 @@
<value>$this</value>
</data>
<data name="&gt;&gt;cbOrientation.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="lblSpacePixel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
<value>3</value>
</data>
<data name="lblSpacePixel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblSpacePixel.Location" type="System.Drawing.Point, System.Drawing">
<value>272, 448</value>
<value>272, 472</value>
</data>
<data name="lblSpacePixel.Size" type="System.Drawing.Size, System.Drawing">
<value>33, 13</value>
</data>
<data name="lblSpacePixel.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
<value>11</value>
</data>
<data name="lblSpacePixel.Text" xml:space="preserve">
<value>pixels</value>
@ -412,6 +391,54 @@
<value>$this</value>
</data>
<data name="&gt;&gt;lblSpacePixel.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="lblImageAlignment.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblImageAlignment.Location" type="System.Drawing.Point, System.Drawing">
<value>8, 448</value>
</data>
<data name="lblImageAlignment.Size" type="System.Drawing.Size, System.Drawing">
<value>87, 13</value>
</data>
<data name="lblImageAlignment.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="lblImageAlignment.Text" xml:space="preserve">
<value>Image alignment:</value>
</data>
<data name="&gt;&gt;lblImageAlignment.Name" xml:space="preserve">
<value>lblImageAlignment</value>
</data>
<data name="&gt;&gt;lblImageAlignment.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;lblImageAlignment.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;lblImageAlignment.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="cbAlignment.Location" type="System.Drawing.Point, System.Drawing">
<value>200, 444</value>
</data>
<data name="cbAlignment.Size" type="System.Drawing.Size, System.Drawing">
<value>120, 21</value>
</data>
<data name="cbAlignment.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="&gt;&gt;cbAlignment.Name" xml:space="preserve">
<value>cbAlignment</value>
</data>
<data name="&gt;&gt;cbAlignment.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;cbAlignment.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;cbAlignment.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
@ -421,7 +448,7 @@
<value>6, 13</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>521, 514</value>
<value>521, 536</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>

View file

@ -23,6 +23,7 @@
#endregion License Information (GPL v3)
using ShareX.HelpersLib;
using System.Windows.Forms;
namespace ShareX.MediaLib
@ -30,6 +31,7 @@ namespace ShareX.MediaLib
public class ImageCombinerOptions
{
public Orientation Orientation { get; set; } = Orientation.Vertical;
public ImageCombinerAlignment Alignment { get; set; } = ImageCombinerAlignment.LeftOrTop;
public int Space { get; set; } = 0;
}
}