From 3a8ba1754fae9540244f5617996a2267d54004a9 Mon Sep 17 00:00:00 2001 From: Manuel Kamper Date: Sat, 10 Aug 2019 12:03:16 +0200 Subject: [PATCH] new function: duplicate image --- Mk0.Software.ImageSorter/Main.Designer.cs | 63 +++++++++++------- Mk0.Software.ImageSorter/Main.cs | 41 ++++++++++++ .../Mk0.Software.ImageSorter.csproj | 3 +- .../Properties/AssemblyInfo.cs | 2 +- .../Properties/Resources.Designer.cs | 10 +++ .../Properties/Resources.resx | 3 + Mk0.Software.ImageSorter/Resources/crop.jpg | Bin 1793 -> 0 bytes .../Resources/duplicate.png | Bin 0 -> 8631 bytes 8 files changed, 96 insertions(+), 26 deletions(-) delete mode 100644 Mk0.Software.ImageSorter/Resources/crop.jpg create mode 100644 Mk0.Software.ImageSorter/Resources/duplicate.png diff --git a/Mk0.Software.ImageSorter/Main.Designer.cs b/Mk0.Software.ImageSorter/Main.Designer.cs index 028d3de..58ece84 100644 --- a/Mk0.Software.ImageSorter/Main.Designer.cs +++ b/Mk0.Software.ImageSorter/Main.Designer.cs @@ -43,6 +43,7 @@ this.labelZielPath = new System.Windows.Forms.Label(); this.buttonQuellPfad = new System.Windows.Forms.Button(); this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.buttonLastImage = new System.Windows.Forms.Button(); this.buttonInfo = new System.Windows.Forms.Button(); this.buttonJumpBack = new System.Windows.Forms.Button(); this.panel2 = new System.Windows.Forms.Panel(); @@ -66,7 +67,7 @@ this.folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); this.comboBoxZoom = new System.Windows.Forms.ComboBox(); this.label3 = new System.Windows.Forms.Label(); - this.buttonLastImage = new System.Windows.Forms.Button(); + this.buttonDuplicate = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); this.contextMenuStrip.SuspendLayout(); this.groupBox1.SuspendLayout(); @@ -222,6 +223,19 @@ this.groupBox2.TabStop = false; this.groupBox2.Text = "Ziele"; // + // buttonLastImage + // + this.buttonLastImage.Font = new System.Drawing.Font("Wingdings", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(2))); + this.buttonLastImage.Location = new System.Drawing.Point(105, 16); + this.buttonLastImage.Name = "buttonLastImage"; + this.buttonLastImage.Size = new System.Drawing.Size(23, 23); + this.buttonLastImage.TabIndex = 9; + this.buttonLastImage.Text = "I"; + this.buttonLastImage.UseVisualStyleBackColor = true; + this.buttonLastImage.Visible = false; + this.buttonLastImage.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ButtonLastImage_MouseDown); + this.buttonLastImage.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ButtonLastImage_MouseUp); + // // buttonInfo // this.buttonInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -298,7 +312,7 @@ this.buttonDeleteImage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.buttonDeleteImage.Location = new System.Drawing.Point(6, 538); this.buttonDeleteImage.Name = "buttonDeleteImage"; - this.buttonDeleteImage.Size = new System.Drawing.Size(100, 23); + this.buttonDeleteImage.Size = new System.Drawing.Size(95, 23); this.buttonDeleteImage.TabIndex = 5; this.buttonDeleteImage.Text = "Löschen"; this.buttonDeleteImage.UseVisualStyleBackColor = true; @@ -307,9 +321,9 @@ // buttonRotate90 // this.buttonRotate90.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonRotate90.Location = new System.Drawing.Point(121, 538); + this.buttonRotate90.Location = new System.Drawing.Point(112, 538); this.buttonRotate90.Name = "buttonRotate90"; - this.buttonRotate90.Size = new System.Drawing.Size(100, 23); + this.buttonRotate90.Size = new System.Drawing.Size(95, 23); this.buttonRotate90.TabIndex = 6; this.buttonRotate90.Tag = "90"; this.buttonRotate90.Text = "Drehen 90°"; @@ -319,9 +333,9 @@ // buttonRotate180 // this.buttonRotate180.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonRotate180.Location = new System.Drawing.Point(227, 538); + this.buttonRotate180.Location = new System.Drawing.Point(213, 538); this.buttonRotate180.Name = "buttonRotate180"; - this.buttonRotate180.Size = new System.Drawing.Size(100, 23); + this.buttonRotate180.Size = new System.Drawing.Size(95, 23); this.buttonRotate180.TabIndex = 7; this.buttonRotate180.Tag = "180"; this.buttonRotate180.Text = "Drehen 180°"; @@ -331,9 +345,9 @@ // buttonRotate270 // this.buttonRotate270.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonRotate270.Location = new System.Drawing.Point(333, 538); + this.buttonRotate270.Location = new System.Drawing.Point(314, 538); this.buttonRotate270.Name = "buttonRotate270"; - this.buttonRotate270.Size = new System.Drawing.Size(100, 23); + this.buttonRotate270.Size = new System.Drawing.Size(95, 23); this.buttonRotate270.TabIndex = 8; this.buttonRotate270.Tag = "270"; this.buttonRotate270.Text = "Drehen 270°"; @@ -343,9 +357,9 @@ // buttonMirrorHorizontal // this.buttonMirrorHorizontal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonMirrorHorizontal.Location = new System.Drawing.Point(448, 538); + this.buttonMirrorHorizontal.Location = new System.Drawing.Point(420, 538); this.buttonMirrorHorizontal.Name = "buttonMirrorHorizontal"; - this.buttonMirrorHorizontal.Size = new System.Drawing.Size(100, 23); + this.buttonMirrorHorizontal.Size = new System.Drawing.Size(95, 23); this.buttonMirrorHorizontal.TabIndex = 9; this.buttonMirrorHorizontal.Tag = "y"; this.buttonMirrorHorizontal.Text = "Spiegeln horiz."; @@ -355,9 +369,9 @@ // buttonMirrorVertikal // this.buttonMirrorVertikal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonMirrorVertikal.Location = new System.Drawing.Point(554, 538); + this.buttonMirrorVertikal.Location = new System.Drawing.Point(521, 538); this.buttonMirrorVertikal.Name = "buttonMirrorVertikal"; - this.buttonMirrorVertikal.Size = new System.Drawing.Size(100, 23); + this.buttonMirrorVertikal.Size = new System.Drawing.Size(95, 23); this.buttonMirrorVertikal.TabIndex = 10; this.buttonMirrorVertikal.Tag = "x"; this.buttonMirrorVertikal.Text = "Spiegeln vertikal"; @@ -481,24 +495,24 @@ this.label3.TabIndex = 15; this.label3.Text = "Zoom"; // - // buttonLastImage + // buttonDuplicate // - this.buttonLastImage.Enabled = false; - this.buttonLastImage.Font = new System.Drawing.Font("Wingdings", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(2))); - this.buttonLastImage.Location = new System.Drawing.Point(105, 16); - this.buttonLastImage.Name = "buttonLastImage"; - this.buttonLastImage.Size = new System.Drawing.Size(23, 23); - this.buttonLastImage.TabIndex = 9; - this.buttonLastImage.Text = "I"; - this.buttonLastImage.UseVisualStyleBackColor = true; - this.buttonLastImage.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ButtonLastImage_MouseDown); - this.buttonLastImage.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ButtonLastImage_MouseUp); + this.buttonDuplicate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonDuplicate.Location = new System.Drawing.Point(627, 538); + this.buttonDuplicate.Name = "buttonDuplicate"; + this.buttonDuplicate.Size = new System.Drawing.Size(95, 23); + this.buttonDuplicate.TabIndex = 16; + this.buttonDuplicate.Tag = "x"; + this.buttonDuplicate.Text = "Duplizieren"; + this.buttonDuplicate.UseVisualStyleBackColor = true; + this.buttonDuplicate.Click += new System.EventHandler(this.ButtonDuplicate_Click); // // Main // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.ClientSize = new System.Drawing.Size(967, 566); + this.Controls.Add(this.buttonDuplicate); this.Controls.Add(this.label3); this.Controls.Add(this.comboBoxZoom); this.Controls.Add(this.panel3); @@ -517,7 +531,7 @@ this.MinimumSize = new System.Drawing.Size(983, 605); this.Name = "Main"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Image Sorter v1.37 | © 2015-2019 by manuelkamper.com"; + this.Text = "Image Sorter v1.39 | © 2015-2019 by manuelkamper.com"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Main_FormClosing); this.Load += new System.EventHandler(this.Main_Load); this.Shown += new System.EventHandler(this.Main_Shown); @@ -579,5 +593,6 @@ private System.Windows.Forms.Button buttonJumpBack; private System.Windows.Forms.Button buttonInfo; private System.Windows.Forms.Button buttonLastImage; + private System.Windows.Forms.Button buttonDuplicate; } } diff --git a/Mk0.Software.ImageSorter/Main.cs b/Mk0.Software.ImageSorter/Main.cs index 4e0b153..be5552c 100644 --- a/Mk0.Software.ImageSorter/Main.cs +++ b/Mk0.Software.ImageSorter/Main.cs @@ -1198,6 +1198,17 @@ namespace Mk0.Software.ImageSorter banner.ShowMessages(); } + /// + /// Anzeige eines Banners bei erstelltem Duplikat + /// + /// + /// + private void ShowDuplicatedMessage(Image bild, string bildpfad) + { + banner.Enqueue("Das Duplikat \"" + Path.GetFileName(bildpfad) + "\" wurde", "erstellt.", bild, Properties.Resources.duplicate); + banner.ShowMessages(); + } + /// /// Bild wieder neu zentrieren und skalieren nach Größenänderung des Fensters /// @@ -1360,14 +1371,44 @@ namespace Mk0.Software.ImageSorter } } + /// + /// Blendet letztes Bild ein + /// + /// + /// private void ButtonLastImage_MouseDown(object sender, MouseEventArgs e) { //todo vorheriges Bild anzeigen } + /// + /// Blendet letztes Bild aus + /// + /// + /// private void ButtonLastImage_MouseUp(object sender, MouseEventArgs e) { //todo vorheriges Bild ausblenden } + + /// + /// + /// + /// + /// + private void ButtonDuplicate_Click(object sender, EventArgs e) + { + //aktuelles bild kopieren + string targetPath = Path.Combine(Path.GetDirectoryName(pictureBox.ImageLocation), Path.GetFileNameWithoutExtension(pictureBox.ImageLocation) + Randomize.NumberAndDigits(5, "_") + Path.GetExtension(pictureBox.ImageLocation)); + File.Copy(pictureBox.ImageLocation, targetPath, true); + + //duplikat als nächstes bild in liste aufnehmen + images.Insert(imageIndex + 1, targetPath); + CountPicsInPath(); + + //duplikat-message anzeigen + Image myImg = CopyImage.GetCopyImage(targetPath); + ShowDuplicatedMessage(myImg, targetPath); + } } } \ No newline at end of file diff --git a/Mk0.Software.ImageSorter/Mk0.Software.ImageSorter.csproj b/Mk0.Software.ImageSorter/Mk0.Software.ImageSorter.csproj index a3ad4cb..5360955 100644 --- a/Mk0.Software.ImageSorter/Mk0.Software.ImageSorter.csproj +++ b/Mk0.Software.ImageSorter/Mk0.Software.ImageSorter.csproj @@ -33,7 +33,7 @@ manuelkamper.com false 0 - 1.38.0.0 + 1.39.0.0 true true true @@ -175,6 +175,7 @@ + diff --git a/Mk0.Software.ImageSorter/Properties/AssemblyInfo.cs b/Mk0.Software.ImageSorter/Properties/AssemblyInfo.cs index 8aaa151..67c68fb 100644 --- a/Mk0.Software.ImageSorter/Properties/AssemblyInfo.cs +++ b/Mk0.Software.ImageSorter/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.38.*")] +[assembly: AssemblyVersion("1.39.*")] //[assembly: AssemblyFileVersion("1.6.0.0")] diff --git a/Mk0.Software.ImageSorter/Properties/Resources.Designer.cs b/Mk0.Software.ImageSorter/Properties/Resources.Designer.cs index 9f8c8cb..4547995 100644 --- a/Mk0.Software.ImageSorter/Properties/Resources.Designer.cs +++ b/Mk0.Software.ImageSorter/Properties/Resources.Designer.cs @@ -90,6 +90,16 @@ namespace Mk0.Software.ImageSorter.Properties { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap duplicate { + get { + object obj = ResourceManager.GetObject("duplicate", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). /// diff --git a/Mk0.Software.ImageSorter/Properties/Resources.resx b/Mk0.Software.ImageSorter/Properties/Resources.resx index 99f7c4a..9531aa3 100644 --- a/Mk0.Software.ImageSorter/Properties/Resources.resx +++ b/Mk0.Software.ImageSorter/Properties/Resources.resx @@ -127,6 +127,9 @@ ..\Resources\delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\duplicate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\gif.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/Mk0.Software.ImageSorter/Resources/crop.jpg b/Mk0.Software.ImageSorter/Resources/crop.jpg deleted file mode 100644 index 9e561e9bc318f7384c1c9fc95479b97034776631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcmb7EX;c$e7=1I7OdudkA^}mbA)tk@D9VvV1p^pDWeX8dR#{wF+$f?IwJbseWCu|| z&b-7mLb9^%yb4Pjc)h^V_)I6tJi2cn zS1-$kyow*3NelrtX~p()>Ht{g9YBi4x6sA_gb-l(O9>=|hys`(2dQDED)Uy*@g3#x zIv^taYsC_$N&QsqYG>Z}y9Ot^8i+X~u;_WrX8RPgca4>s*bezW_19KuG%qu6|3l&* zzES?%6UjjBp5oq-BZ9ppk?Du_wp<+<_J5Lile~0gXlra&a$}Txtl3#d`um4*{0sHs zqFl{|E$n>;!lLEWhUOU+lgEtC5>3Y-w~0WtObwBbwY%`NzK2Urxg=w3b-`7IT#+ls z!t?U#&@aDB@Rm_3v@?YH6WwO;uoApO6 zmT)7VtL3bFoLFU~_BLLgSH}xUT66-?YQgorell_u6yaWt;_`7 zHBNGi_|f)F>eKlL-z^T^Gvu4zFg$Xr!>cZSr_#QP{DPXjOP8N_^3g9$evww9e1lW8 zYcwf;*w4hTi6eYb5_)LAQDanpTBg2FWPyIYPZ=+a=DP_kr%257u0{Fw`{@6AiT$#;D!E>F}uCeV*Dp#}DSP&dE^Lb}9EMe1!2d(o;RZR4#O zR|dx#3g-vUoqpRV^cA`K@VYs|1-#PsqO8?3ez?Zy7;YN;oWVu+Swgt)aq(buuK(_q z>c3rOrM3BYBDb?3JjMNVWVlUYr75E`m>-&(e30G}N2@o_`|Z?wK1~}kcQy}X77f&# zj>aZNifTF;;&XrU%nr0E9af0Qe>JEm8C`#uv?CZfp0Xm_agk=>&_Pkc%Qj0M*Unn^ zqT6KYrR7Cdj)nnbF=qmeHX&8s3GKeW{?dFe&Di2{gMcPai#!!iE9G3l1NN4wGjlDh ztPNgy9RtzX3v&LOMK|WgVEz*sE&nizv1#ib z#cNSC6Z2;7Cu})FI4)mlabPky<{8X4ezYbACNQ{*wzqoc@)eMJQ?@DWj;W_;!SvTI z9nUmgHlG*^`7o|w6izucT9$UWo`$vcp6x!x@Lvy@_qE+uwXQQJYtNGyTK+h7pjnB! zGERuAylCGbGVs9;3{KzNim-MlfJ#m>%z$*Ea+w`i%JRLP?R=hxr8 zz;*zghMqvqR<~CkW`5?(F4YZEV5!?Qv>_rk%un-rJXvL-u`oM2og8M{o>tJOWI$GQ mxsL9*`%4nX?bLoRaT*2nUd{_IO{L!DKLw^BJ$%g>| diff --git a/Mk0.Software.ImageSorter/Resources/duplicate.png b/Mk0.Software.ImageSorter/Resources/duplicate.png new file mode 100644 index 0000000000000000000000000000000000000000..07d6888b231c401b57eb8c7b52cf86d1e2893b83 GIT binary patch literal 8631 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