From 96eedf6c39baa31e204e649f13e89f2bc1f33d90 Mon Sep 17 00:00:00 2001 From: Manuel Kamper Date: Thu, 26 Dec 2019 20:59:23 +0100 Subject: [PATCH] EXIF-data reader for pictures implemented --- Mk0.Software.ImageSorter/App.config | 16 +- Mk0.Software.ImageSorter/EXIF.Designer.cs | 64 ++ Mk0.Software.ImageSorter/EXIF.cs | 607 ++++++++++++++++++ Mk0.Software.ImageSorter/EXIF.resx | 120 ++++ Mk0.Software.ImageSorter/Main.Designer.cs | 48 +- Mk0.Software.ImageSorter/Main.cs | 34 +- .../Mk0.Software.ImageSorter.csproj | 36 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/Resources.Designer.cs | 2 +- .../Properties/Settings.Designer.cs | 2 +- .../dll/Mk0.GUI.Banner.dll | Bin 8192 -> 0 bytes .../dll/Mk0.Tools.Calculation.dll | Bin 4608 -> 0 bytes .../dll/Mk0.Tools.ImageCropper.dll | Bin 20480 -> 0 bytes .../dll/Mk0.Tools.Images.dll | Bin 6656 -> 0 bytes .../dll/Mk0.Tools.Randomization.dll | Bin 5120 -> 0 bytes Mk0.Software.ImageSorter/packages.config | 10 +- 16 files changed, 880 insertions(+), 63 deletions(-) create mode 100644 Mk0.Software.ImageSorter/EXIF.Designer.cs create mode 100644 Mk0.Software.ImageSorter/EXIF.cs create mode 100644 Mk0.Software.ImageSorter/EXIF.resx delete mode 100644 Mk0.Software.ImageSorter/dll/Mk0.GUI.Banner.dll delete mode 100644 Mk0.Software.ImageSorter/dll/Mk0.Tools.Calculation.dll delete mode 100644 Mk0.Software.ImageSorter/dll/Mk0.Tools.ImageCropper.dll delete mode 100644 Mk0.Software.ImageSorter/dll/Mk0.Tools.Images.dll delete mode 100644 Mk0.Software.ImageSorter/dll/Mk0.Tools.Randomization.dll diff --git a/Mk0.Software.ImageSorter/App.config b/Mk0.Software.ImageSorter/App.config index aa65d8e..161ff3f 100644 --- a/Mk0.Software.ImageSorter/App.config +++ b/Mk0.Software.ImageSorter/App.config @@ -1,21 +1,21 @@ - -
-
+ +
+
- + - + - + True @@ -38,10 +38,10 @@ - + - + True diff --git a/Mk0.Software.ImageSorter/EXIF.Designer.cs b/Mk0.Software.ImageSorter/EXIF.Designer.cs new file mode 100644 index 0000000..0f02559 --- /dev/null +++ b/Mk0.Software.ImageSorter/EXIF.Designer.cs @@ -0,0 +1,64 @@ +namespace Mk0.Software.ImageSorter +{ + partial class EXIF + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.treeViewExif = new System.Windows.Forms.TreeView(); + this.SuspendLayout(); + // + // treeViewExif + // + this.treeViewExif.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.treeViewExif.Location = new System.Drawing.Point(12, 12); + this.treeViewExif.Name = "treeViewExif"; + this.treeViewExif.Size = new System.Drawing.Size(343, 367); + this.treeViewExif.TabIndex = 1; + // + // EXIF + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(367, 391); + this.Controls.Add(this.treeViewExif); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "EXIF"; + this.ShowIcon = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "EXIF"; + this.Shown += new System.EventHandler(this.EXIF_Shown); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.TreeView treeViewExif; + } +} \ No newline at end of file diff --git a/Mk0.Software.ImageSorter/EXIF.cs b/Mk0.Software.ImageSorter/EXIF.cs new file mode 100644 index 0000000..30e9fc9 --- /dev/null +++ b/Mk0.Software.ImageSorter/EXIF.cs @@ -0,0 +1,607 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Imaging; + +namespace Mk0.Software.ImageSorter +{ + public partial class EXIF : Form + { + private List exifData; + + public EXIF(PropertyItem[] propertyItems) + { + InitializeComponent(); + exifData = new List(); + foreach (PropertyItem propItem in propertyItems) + { + Exifdata ed = new Exifdata(propItem.Id, propItem.Type, propItem.Len, propItem.Value); + exifData.Add(ed); + } + } + + private void EXIF_Shown(object sender, EventArgs e) + { + treeViewExif.BeginUpdate(); + foreach (Exifdata ed in exifData) + { + if (ed.ID != "ThumbnailData") + { + TreeNode node = new TreeNode(ed.ID); + node.Nodes.Add(new TreeNode(ed.Value)); + + node.Nodes.Add(new TreeNode(ed.Type)); + node.Nodes.Add(new TreeNode(ed.Length)); + + treeViewExif.Nodes.Add(node); + node.Expand(); + } + } + treeViewExif.TreeViewNodeSorter = new Sorter(); + treeViewExif.Sort(); + treeViewExif.EndUpdate(); + } + } + + public class Exifdata + { + private const string DOUBLETYPE_FORMAT = "0.0####"; + private const int BYTEJUMP_SHORT = 2; + private const int BYTEJUMP_LONG = 4; + private const int BYTEJUMP_RATIONAL = 8; + private const int BYTEJUMP_SLONG = 4; + private const int BYTEJUMP_SRATIONAL = 8; + public string ID, Type, Length, Value; + public short TypeOriginal; + + public Exifdata(int id, short type, int len, byte[] value) + { + ID = new Exifid("0x" + id.ToString("x4")).Readable; + TypeOriginal = type; + Type = ExifType(type); + Length = len.ToString() + " bytes"; + Value = ExifValue(value, type, len); + } + + public string ExifValue(byte[] value, short type, int len) + { + ASCIIEncoding encoding = new ASCIIEncoding(); + string ev = ""; + + if (type == 1) + { + ev = BitConverter.ToString(value, 0, len); + } + else if (type == 2) + { + ev = encoding.GetString(value, 0, len - 1); + } + else if (type == 3) + { + for (int i = 0; i < len; i = i + BYTEJUMP_SHORT) + { + ushort val = BitConverter.ToUInt16(value, i); + ev += val.ToString(); + if (i + BYTEJUMP_SHORT < len) + ev += " "; + } + } + else if (type == 4) + { + for (int i = 0; i < len; i = i + BYTEJUMP_LONG) + { + uint val = BitConverter.ToUInt32(value, i); + ev += val.ToString(); + if (i + BYTEJUMP_LONG < len) + ev += " "; + } + } + else if (type == 5) + { + for (int i = 0; i < len; i = i + BYTEJUMP_RATIONAL) + { + uint numer = BitConverter.ToUInt32(value, i); + uint denom = BitConverter.ToUInt32(value, i + BYTEJUMP_LONG); + //if (formatInstr == FormatInstr.FRACTION) + if(false) + { + UFraction frac = new UFraction(numer, denom); + ev += frac.ToString(); + } + else + { + double dbl; + if (denom == 0) + dbl = 0.0; + else + dbl = (double)numer / (double)denom; + ev += dbl.ToString(DOUBLETYPE_FORMAT); + } + if (i + BYTEJUMP_RATIONAL < len) + ev += " "; + } + } + else if (type == 6) + { + //if (formatInstr == FormatInstr.ALLCHAR) + if (false) + { + ev = encoding.GetString(value, 0, len); + } + else + { + ev = BitConverter.ToString(value, 0, len); + } + } + else if (type == 7) + { + try + { + for (int i = 0; i < len; i = i + BYTEJUMP_SLONG) + { + int val = BitConverter.ToInt32(value, i); + ev += val.ToString(); + if (i + BYTEJUMP_SLONG < len) + ev += " "; + } + } + catch (Exception ex) + { + ev = ex.ToString(); + } + } + else if (type == 10) + { + for (int i = 0; i < len; i = i + BYTEJUMP_SRATIONAL) + { + int numer = BitConverter.ToInt32(value, i); + int denom = BitConverter.ToInt32(value, i + BYTEJUMP_SLONG); + //if (formatInstr == FormatInstr.FRACTION) + if (false) + { + Fraction frac = new Fraction(numer, denom); + ev += frac.ToString(); + } + else + { + double dbl; + if (denom == 0) + dbl = 0.0; + else + dbl = (double)numer / (double)denom; + ev += dbl.ToString(DOUBLETYPE_FORMAT); + } + if (i + BYTEJUMP_SRATIONAL < len) + ev += " "; + } + } + else + { + ev = "unlesbarer Typ"; + } + + return ev; + } + + public string ExifType(short type) + { + switch (type) + { + case 1: + return "unsigned array of bytes"; + case 2: + return "ASCII string"; + case 3: + return "array of unsigned short (16-bit) integers"; + case 4: + return "array of unsigned long (32-bit) integers"; + case 5: + return "array of pairs of unsigned long integers"; + case 6: + return "signed array of bytes"; + case 7: + return "array of signed long (32-bit) integers"; + case 10: + return "array of pairs of signed long integers"; + default: + return "unknown"; + } + } + } + + public class Exifid + { + public string Readable; + public Dictionary ids = new Dictionary(); + + public Exifid(string id) + { + ids.Add("0x0000", "GPS Version"); + ids.Add("0x0001", "GPS Latitude Nord- oder Südhalbkugel"); + ids.Add("0x0002", "GPS Latitude"); + ids.Add("0x0003", "GPS Longitude Ost oder West"); + ids.Add("0x0004", "GPS Longitude"); + ids.Add("0x0005", "GPS AltitudeRef"); + ids.Add("0x0006", "GPS Altitude"); + ids.Add("0x0007", "GPS Time"); + ids.Add("0x0008", "GPS Satellites"); + ids.Add("0x0009", "GPS Status"); + ids.Add("0x000a", "GPS MeasureMode"); + ids.Add("0x000b", "GPS Dop"); + ids.Add("0x000c", "GPS SpeedRef"); + ids.Add("0x000d", "GPS Speed"); + ids.Add("0x000e", "GPS TrackRef"); + ids.Add("0x000f", "GPS Track"); + ids.Add("0x0010", "GPS ImgDirRef"); + ids.Add("0x0011", "GPS ImgDir"); + ids.Add("0x0012", "GPS MapDatum"); + ids.Add("0x0013", "GPS DestLatRef"); + ids.Add("0x0014", "GPS DestLat"); + ids.Add("0x0015", "GPS DestLongRef"); + ids.Add("0x0016", "GPS DestLong"); + ids.Add("0x0017", "GPS DestBearRef"); + ids.Add("0x0018", "GPS DestBear"); + ids.Add("0x0019", "GPS DestDistRef"); + ids.Add("0x001a", "GPS DestDist"); + ids.Add("0x00fe", "NewSubfileType"); + ids.Add("0x00ff", "SubfileType"); + ids.Add("0x0100", "ImageWidth"); + ids.Add("0x0101", "ImageHeight"); + ids.Add("0x0102", "BitsPerSample"); + ids.Add("0x0103", "Compression"); + ids.Add("0x0106", "PhotometricInterp"); + ids.Add("0x0107", "ThreshHolding"); + ids.Add("0x0108", "CellWidth"); + ids.Add("0x0109", "CellHeight"); + ids.Add("0x010a", "FillOrder"); + ids.Add("0x010d", "DocumentName"); + ids.Add("0x010e", "ImageDescription"); + ids.Add("0x010f", "EquipMake"); + ids.Add("0x0110", "EquipModel"); + ids.Add("0x0111", "StripOffsets"); + ids.Add("0x0112", "Orientation"); + ids.Add("0x0115", "SamplesPerPixel"); + ids.Add("0x0116", "RowsPerStrip"); + ids.Add("0x0117", "StripBytesCount"); + ids.Add("0x0118", "MinSampleValue"); + ids.Add("0x0119", "MaxSampleValue"); + ids.Add("0x011a", "XResolution"); + ids.Add("0x011b", "YResolution"); + ids.Add("0x011c", "PlanarConfig"); + ids.Add("0x011d", "PageName"); + ids.Add("0x011e", "XPosition"); + ids.Add("0x011f", "YPosition"); + ids.Add("0x0120", "FreeOffset"); + ids.Add("0x0121", "FreeByteCounts"); + ids.Add("0x0122", "GrayResponseUnit"); + ids.Add("0x0123", "GrayResponseCurve"); + ids.Add("0x0124", "T4Option"); + ids.Add("0x0125", "T6Option"); + ids.Add("0x0128", "ResolutionUnit"); + ids.Add("0x0129", "PageNumber"); + ids.Add("0x012d", "TransferFunction"); + ids.Add("0x0131", "SoftwareUsed"); + ids.Add("0x0132", "DateTime"); + ids.Add("0x013b", "Artist"); + ids.Add("0x013c", "HostComputer"); + ids.Add("0x013d", "Predictor"); + ids.Add("0x013e", "WhitePoint"); + ids.Add("0x013f", "PrimaryChromaticities"); + ids.Add("0x0140", "ColorMap"); + ids.Add("0x0141", "HalftoneHints"); + ids.Add("0x0142", "TileWidth"); + ids.Add("0x0143", "TileLength"); + ids.Add("0x0144", "TileOffset"); + ids.Add("0x0145", "TileByteCounts"); + ids.Add("0x014c", "InkSet"); + ids.Add("0x014d", "InkNames"); + ids.Add("0x014e", "NumberOfInks"); + ids.Add("0x0150", "DotRange"); + ids.Add("0x0151", "TargetPrinter"); + ids.Add("0x0152", "ExtraSamples"); + ids.Add("0x0153", "SampleFormat"); + ids.Add("0x0154", "SMinSampleValue"); + ids.Add("0x0155", "SMaxSampleValue"); + ids.Add("0x0156", "TransferRange"); + ids.Add("0x0200", "JPEGProc"); + ids.Add("0x0201", "JPEGInterFormat"); + ids.Add("0x0202", "JPEGInterLength"); + ids.Add("0x0203", "JPEGRestartInterval"); + ids.Add("0x0205", "JPEGLosslessPredictors"); + ids.Add("0x0206", "JPEGPointTransforms"); + ids.Add("0x0207", "JPEGQTables"); + ids.Add("0x0208", "JPEGDCTables"); + ids.Add("0x0209", "JPEGACTables"); + ids.Add("0x0211", "YCbCrCoefficients"); + ids.Add("0x0212", "YCbCrSubsampling"); + ids.Add("0x0213", "YCbCrPositioning"); + ids.Add("0x0214", "REFBlackWhite"); + ids.Add("0x0301", "Gamma"); + ids.Add("0x0302", "ICCProfileDescriptor"); + ids.Add("0x0303", "SRGBRenderingIntent"); + ids.Add("0x0320", "ImageTitle"); + ids.Add("0x5001", "ResolutionXUnit"); + ids.Add("0x5002", "ResolutionYUnit"); + ids.Add("0x5003", "ResolutionXLengthUnit"); + ids.Add("0x5004", "ResolutionYLengthUnit"); + ids.Add("0x5005", "PrintFlags"); + ids.Add("0x5006", "PrintFlagsVersion"); + ids.Add("0x5007", "PrintFlagsCrop"); + ids.Add("0x5008", "PrintFlagsBleedWidth"); + ids.Add("0x5009", "PrintFlagsBleedWidthScale"); + ids.Add("0x500a", "HalftoneLPI"); + ids.Add("0x500b", "HalftoneLPIUnit"); + ids.Add("0x500c", "HalftoneDegree"); + ids.Add("0x500d", "HalftoneShape"); + ids.Add("0x500e", "HalftoneMisc"); + ids.Add("0x500f", "HalftoneScreen"); + ids.Add("0x5010", "JPEGQuality"); + ids.Add("0x5011", "GridSize"); + ids.Add("0x5012", "ThumbnailFormat"); + ids.Add("0x5013", "ThumbnailWidth"); + ids.Add("0x5014", "ThumbnailHeight"); + ids.Add("0x5015", "ThumbnailColorDepth"); + ids.Add("0x5016", "ThumbnailPlanes"); + ids.Add("0x5017", "ThumbnailRawBytes"); + ids.Add("0x5018", "ThumbnailSize"); + ids.Add("0x5019", "ThumbnailCompressedSize"); + ids.Add("0x501a", "ColorTransferFunction"); + ids.Add("0x501b", "ThumbnailData"); + ids.Add("0x5020", "ThumbnailImageWidth"); + ids.Add("0x5021", "ThumbnailImageHeight"); + ids.Add("0x5022", "ThumbnailBitsPerSample"); + ids.Add("0x5023", "ThumbnailCompression"); + ids.Add("0x5024", "ThumbnailPhotometricInterp"); + ids.Add("0x5025", "ThumbnailImageDescription"); + ids.Add("0x5026", "ThumbnailEquipMake"); + ids.Add("0x5027", "ThumbnailEquipModel"); + ids.Add("0x5028", "ThumbnailStripOffsets"); + ids.Add("0x5029", "ThumbnailOrientation"); + ids.Add("0x502a", "ThumbnailSamplesPerPixel"); + ids.Add("0x502b", "ThumbnailRowsPerStrip"); + ids.Add("0x502c", "ThumbnailStripBytesCount"); + ids.Add("0x502d", "ThumbnailResolutionX"); + ids.Add("0x502e", "ThumbnailResolutionY"); + ids.Add("0x502f", "ThumbnailPlanarConfig"); + ids.Add("0x5030", "ThumbnailResolutionUnit"); + ids.Add("0x5031", "ThumbnailTransferFunction"); + ids.Add("0x5032", "ThumbnailSoftwareUsed"); + ids.Add("0x5033", "ThumbnailDateTime"); + ids.Add("0x5034", "ThumbnailArtist"); + ids.Add("0x5035", "ThumbnailWhitePoint"); + ids.Add("0x5036", "ThumbnailPrimaryChromaticities"); + ids.Add("0x5037", "ThumbnailYCbCrCoefficients"); + ids.Add("0x5038", "ThumbnailYCbCrSubsampling"); + ids.Add("0x5039", "ThumbnailYCbCrPositioning"); + ids.Add("0x503a", "ThumbnailRefBlackWhite"); + ids.Add("0x503b", "ThumbnailCopyRight"); + ids.Add("0x5041", "InteroperabilityIndex"); + ids.Add("0x5042", "ExifInteroperabilityVersion"); + ids.Add("0x5090", "LuminanceTable"); + ids.Add("0x5091", "ChrominanceTable"); + ids.Add("0x5100", "FrameDelay"); + ids.Add("0x5101", "LoopCount"); + ids.Add("0x5102", "GlobalPalette"); + ids.Add("0x5103", "IndexBackground"); + ids.Add("0x5104", "IndexTransparent"); + ids.Add("0x5110", "PixelUnit"); + ids.Add("0x5111", "PixelPerUnitX"); + ids.Add("0x5112", "PixelPerUnitY"); + ids.Add("0x5113", "PaletteHistogram"); + ids.Add("0x8298", "Copyright"); + ids.Add("0x829a", "ExifExposureTime"); + ids.Add("0x829d", "ExifFNumber"); + ids.Add("0x8769", "ExifIFD"); + ids.Add("0x8773", "ICCProfile"); + ids.Add("0x8822", "ExifExposureProg"); + ids.Add("0x8824", "ExifSpectralSense"); + ids.Add("0x8825", "GPS IFD"); + ids.Add("0x8827", "ExifISOSpeed"); + ids.Add("0x8828", "ExifOECF"); + ids.Add("0x9000", "ExifVer"); + ids.Add("0x9003", "ExifDTOrig"); + ids.Add("0x9004", "ExifDTDigitized"); + ids.Add("0x9101", "ExifCompConfig"); + ids.Add("0x9102", "ExifCompBPP"); + ids.Add("0x9201", "ExifShutterSpeed"); + ids.Add("0x9202", "ExifAperture"); + ids.Add("0x9203", "ExifBrightness"); + ids.Add("0x9204", "ExifExposureBias"); + ids.Add("0x9205", "ExifMaxAperture"); + ids.Add("0x9206", "ExifSubjectDist"); + ids.Add("0x9207", "ExifMeteringMode"); + ids.Add("0x9208", "ExifLightSource"); + ids.Add("0x9209", "ExifFlash"); + ids.Add("0x920a", "ExifFocalLength"); + ids.Add("0x927c", "ExifMakerNote"); + ids.Add("0x9286", "ExifUserComment"); + ids.Add("0x9290", "ExifDTSubsec"); + ids.Add("0x9291", "ExifDTOrigSS"); + ids.Add("0x9292", "ExifDTDigSS"); + ids.Add("0xa000", "ExifFPXVer"); + ids.Add("0xa001", "ExifColorSpace"); + ids.Add("0xa002", "ExifPixXDim"); + ids.Add("0xa003", "ExifPixYDim"); + ids.Add("0xa004", "ExifRelatedWav"); + ids.Add("0xa005", "ExifInterop"); + ids.Add("0xa20b", "ExifFlashEnergy"); + ids.Add("0xa20c", "ExifSpatialFR"); + ids.Add("0xa20e", "ExifFocalXRes"); + ids.Add("0xa20f", "ExifFocalYRes"); + ids.Add("0xa210", "ExifFocalResUnit"); + ids.Add("0xa214", "ExifSubjectLoc"); + ids.Add("0xa215", "ExifExposureIndex"); + ids.Add("0xa217", "ExifSensingMethod"); + ids.Add("0xa300", "ExifFileSource"); + ids.Add("0xa301", "ExifSceneType"); + ids.Add("0xa302", "ExifCfaPattern"); + ids.Add("0xa402", "ExposureMode"); + ids.Add("0xa403", "WhiteBalance"); + ids.Add("0xa404", "DigitalZoomRatio"); + ids.Add("0xa405", "FocalLengthIn35mmFilm"); + ids.Add("0xa406", "SceneCaptureType"); + ids.Add("0xa407", "GainControl"); + ids.Add("0xa408", "Contrast"); + ids.Add("0xa409", "Saturation"); + ids.Add("0xa40a", "Sharpness"); + ids.Add("0xa40c", "SubjectDistanceRange"); + + if (ids.TryGetValue(id.ToLower(), out Readable)) + { + // + } + else + { + Readable = id; + } + } + } + + public class Fraction + { + private Int32 _numer; + private Int32 _denom; + + public Fraction(Int32 numer, Int32 denom) + { + _numer = numer; + _denom = denom; + } + + /// + /// Converts the signed numerator and denominator values + /// to its equivalent string representation. + /// A fraction (x/y) is returned when applicable. + public override string ToString() + { + Int32 numer = _numer; + Int32 denom = (_denom == 0) ? 1 : _denom; + + // Make the numerator "store" the sign + if (denom < 0) + { + numer = numer * -1; + denom = denom * -1; + } + + Reduce(ref numer, ref denom); + + string result; + if (numer == 0) + result = "0"; + else if (denom == 1) + result = numer + ""; + else + result = numer + "/" + denom; + + return result; + } + + /// + /// Reduces the rational number by dividing both the numerator + /// and the denominator by their greatest common divisor. + private static void Reduce(ref Int32 numer, ref Int32 denom) + { + if (numer != 0) + { + Int32 common = GCD(Math.Abs(numer), denom); + + numer = numer / common; + denom = denom / common; + } + } + + /// + /// Computes and returns the greatest common divisor of the two + /// positive parameters. Uses Euclid's algorithm. + private static Int32 GCD(Int32 num1, Int32 num2) + { + while (num1 != num2) + if (num1 > num2) + num1 = num1 - num2; + else + num2 = num2 - num1; + + return num1; + } + } + + public class UFraction + { + private UInt32 _numer; + private UInt32 _denom; + + public UFraction(UInt32 numer, UInt32 denom) + { + _numer = numer; + _denom = denom; + } + + /// + /// Converts the unsigned numerator and denominator values + /// to its equivalent string representation. + /// A fraction is used when applicable. + public override string ToString() + { + UInt32 numer = _numer; + UInt32 denom = (_denom == 0) ? 1 : _denom; + + Reduce(ref numer, ref denom); + + string result; + if (numer == 0) + result = "0"; + else if (denom == 1) + result = numer + ""; + else + result = numer + "/" + denom; + + return result; + } + + /// + /// Reduces the rational number by dividing both the numerator + /// and the denominator by their greatest common divisor. + private static void Reduce(ref UInt32 numer, ref UInt32 denom) + { + if (numer != 0) + { + UInt32 common = GCD(numer, denom); + + numer = numer / common; + denom = denom / common; + } + } + + /// + /// Computes and returns the greatest common divisor of the two + /// positive parameters. Uses Euclid's algorithm. + private static UInt32 GCD(UInt32 num1, UInt32 num2) + { + while (num1 != num2) + if (num1 > num2) + num1 = num1 - num2; + else + num2 = num2 - num1; + + return num1; + } + } + + public class Sorter : System.Collections.IComparer + { + public int Compare(object x, object y) + { + TreeNode tx = x as TreeNode; + TreeNode ty = y as TreeNode; + + // If this is a child node, preserve the same order by comparing the node Index, not the text + if (tx.Parent != null && ty.Parent != null) + return tx.Index - ty.Index; + + // This is a root node, compare by name. + return string.Compare(tx.Text, ty.Text); + } + } +} diff --git a/Mk0.Software.ImageSorter/EXIF.resx b/Mk0.Software.ImageSorter/EXIF.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Mk0.Software.ImageSorter/EXIF.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Mk0.Software.ImageSorter/Main.Designer.cs b/Mk0.Software.ImageSorter/Main.Designer.cs index 9fcdae5..353f45b 100644 --- a/Mk0.Software.ImageSorter/Main.Designer.cs +++ b/Mk0.Software.ImageSorter/Main.Designer.cs @@ -36,6 +36,7 @@ this.toolStripMenuItemEditImage = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemOpenExplorer = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemImageDetails = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemShowEXIF = new System.Windows.Forms.ToolStripMenuItem(); this.buttonSettings = new System.Windows.Forms.Button(); this.labelQuellPath = new System.Windows.Forms.Label(); this.groupBoxInformationen = new System.Windows.Forms.GroupBox(); @@ -121,45 +122,53 @@ this.toolStripMenuItemCropImage, this.toolStripMenuItemEditImage, this.toolStripMenuItemOpenExplorer, - this.toolStripMenuItemImageDetails}); + this.toolStripMenuItemImageDetails, + this.toolStripMenuItemShowEXIF}); this.contextMenuStrip.Name = "contextMenuStrip"; - this.contextMenuStrip.Size = new System.Drawing.Size(196, 92); + this.contextMenuStrip.Size = new System.Drawing.Size(206, 114); // // toolStripMenuItemCropImage // this.toolStripMenuItemCropImage.Name = "toolStripMenuItemCropImage"; - this.toolStripMenuItemCropImage.Size = new System.Drawing.Size(195, 22); + this.toolStripMenuItemCropImage.Size = new System.Drawing.Size(205, 22); this.toolStripMenuItemCropImage.Text = "Bild zuschneiden (F2)"; this.toolStripMenuItemCropImage.Click += new System.EventHandler(this.BildZuschneidenToolStripMenuItem_Click); // // toolStripMenuItemEditImage // this.toolStripMenuItemEditImage.Name = "toolStripMenuItemEditImage"; - this.toolStripMenuItemEditImage.Size = new System.Drawing.Size(195, 22); + this.toolStripMenuItemEditImage.Size = new System.Drawing.Size(205, 22); this.toolStripMenuItemEditImage.Text = "Bild bearbeiten (F3)"; this.toolStripMenuItemEditImage.Click += new System.EventHandler(this.ToolStripMenuItemEditImage_Click); // // toolStripMenuItemOpenExplorer // this.toolStripMenuItemOpenExplorer.Name = "toolStripMenuItemOpenExplorer"; - this.toolStripMenuItemOpenExplorer.Size = new System.Drawing.Size(195, 22); + this.toolStripMenuItemOpenExplorer.Size = new System.Drawing.Size(205, 22); this.toolStripMenuItemOpenExplorer.Text = "Speicherort öffnen (F4)"; this.toolStripMenuItemOpenExplorer.Click += new System.EventHandler(this.ToolStripMenuItemOpenExplorer_Click); // // toolStripMenuItemImageDetails // this.toolStripMenuItemImageDetails.Name = "toolStripMenuItemImageDetails"; - this.toolStripMenuItemImageDetails.Size = new System.Drawing.Size(195, 22); + this.toolStripMenuItemImageDetails.Size = new System.Drawing.Size(205, 22); this.toolStripMenuItemImageDetails.Text = "Bildeigenschaften (F5)"; this.toolStripMenuItemImageDetails.Click += new System.EventHandler(this.ToolStripMenuItemImageDetails_Click); // + // toolStripMenuItemShowEXIF + // + this.toolStripMenuItemShowEXIF.Name = "toolStripMenuItemShowEXIF"; + this.toolStripMenuItemShowEXIF.Size = new System.Drawing.Size(205, 22); + this.toolStripMenuItemShowEXIF.Text = "EXIF-Daten anzeigen (F6)"; + this.toolStripMenuItemShowEXIF.Click += new System.EventHandler(this.ToolStripMenuItemShowEXIF_Click); + // // buttonSettings // this.buttonSettings.Font = new System.Drawing.Font("Webdings", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(2))); this.buttonSettings.Location = new System.Drawing.Point(233, 16); this.buttonSettings.Name = "buttonSettings"; this.buttonSettings.Size = new System.Drawing.Size(23, 23); - this.buttonSettings.TabIndex = 1; + this.buttonSettings.TabIndex = 7; this.buttonSettings.Text = "@"; this.buttonSettings.UseVisualStyleBackColor = true; this.buttonSettings.Click += new System.EventHandler(this.ButtonSettings_Click); @@ -213,7 +222,7 @@ this.buttonQuellPfad.Location = new System.Drawing.Point(204, 16); this.buttonQuellPfad.Name = "buttonQuellPfad"; this.buttonQuellPfad.Size = new System.Drawing.Size(23, 23); - this.buttonQuellPfad.TabIndex = 4; + this.buttonQuellPfad.TabIndex = 6; this.buttonQuellPfad.Text = "1"; this.buttonQuellPfad.UseVisualStyleBackColor = true; this.buttonQuellPfad.Click += new System.EventHandler(this.ButtonQuellPfad_Click); @@ -243,7 +252,7 @@ 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.TabIndex = 4; this.buttonLastImage.Text = "I"; this.buttonLastImage.UseVisualStyleBackColor = true; this.buttonLastImage.Visible = false; @@ -256,7 +265,7 @@ this.buttonInfo.Location = new System.Drawing.Point(175, 16); this.buttonInfo.Name = "buttonInfo"; this.buttonInfo.Size = new System.Drawing.Size(23, 23); - this.buttonInfo.TabIndex = 8; + this.buttonInfo.TabIndex = 5; this.buttonInfo.Text = "i"; this.buttonInfo.UseVisualStyleBackColor = true; this.buttonInfo.Click += new System.EventHandler(this.ButtonInfo_Click); @@ -267,7 +276,7 @@ this.buttonJumpBack.Location = new System.Drawing.Point(6, 16); this.buttonJumpBack.Name = "buttonJumpBack"; this.buttonJumpBack.Size = new System.Drawing.Size(23, 23); - this.buttonJumpBack.TabIndex = 7; + this.buttonJumpBack.TabIndex = 1; this.buttonJumpBack.Text = "ç"; this.buttonJumpBack.UseVisualStyleBackColor = true; this.buttonJumpBack.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ButtonJumpBack_Click); @@ -304,7 +313,7 @@ this.buttonJumpForward.Location = new System.Drawing.Point(35, 16); this.buttonJumpForward.Name = "buttonJumpForward"; this.buttonJumpForward.Size = new System.Drawing.Size(23, 23); - this.buttonJumpForward.TabIndex = 1; + this.buttonJumpForward.TabIndex = 2; this.buttonJumpForward.Text = "è"; this.buttonJumpForward.UseVisualStyleBackColor = true; this.buttonJumpForward.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ButtonJumpForward_Click); @@ -316,7 +325,7 @@ this.buttonUndo.Location = new System.Drawing.Point(64, 16); this.buttonUndo.Name = "buttonUndo"; this.buttonUndo.Size = new System.Drawing.Size(23, 23); - this.buttonUndo.TabIndex = 2; + this.buttonUndo.TabIndex = 3; this.buttonUndo.Text = "Õ"; this.buttonUndo.UseVisualStyleBackColor = true; this.buttonUndo.Click += new System.EventHandler(this.ButtonUndo_Click); @@ -327,7 +336,7 @@ this.buttonDeleteImage.Location = new System.Drawing.Point(6, 538); this.buttonDeleteImage.Name = "buttonDeleteImage"; this.buttonDeleteImage.Size = new System.Drawing.Size(95, 23); - this.buttonDeleteImage.TabIndex = 5; + this.buttonDeleteImage.TabIndex = 10; this.buttonDeleteImage.Text = "Löschen"; this.buttonDeleteImage.UseVisualStyleBackColor = true; this.buttonDeleteImage.Click += new System.EventHandler(this.ImageDelete); @@ -602,7 +611,7 @@ this.buttonDuplicate.Location = new System.Drawing.Point(220, 538); this.buttonDuplicate.Name = "buttonDuplicate"; this.buttonDuplicate.Size = new System.Drawing.Size(95, 23); - this.buttonDuplicate.TabIndex = 16; + this.buttonDuplicate.TabIndex = 12; this.buttonDuplicate.Tag = ""; this.buttonDuplicate.Text = "Duplizieren"; this.buttonDuplicate.UseVisualStyleBackColor = true; @@ -630,7 +639,7 @@ this.buttonTransformation.Location = new System.Drawing.Point(113, 538); this.buttonTransformation.Name = "buttonTransformation"; this.buttonTransformation.Size = new System.Drawing.Size(95, 23); - this.buttonTransformation.TabIndex = 18; + this.buttonTransformation.TabIndex = 11; this.buttonTransformation.Tag = ""; this.buttonTransformation.Text = "Transformation"; this.buttonTransformation.UseVisualStyleBackColor = true; @@ -642,7 +651,7 @@ this.buttonHintergrund.Location = new System.Drawing.Point(327, 538); this.buttonHintergrund.Name = "buttonHintergrund"; this.buttonHintergrund.Size = new System.Drawing.Size(95, 23); - this.buttonHintergrund.TabIndex = 19; + this.buttonHintergrund.TabIndex = 13; this.buttonHintergrund.Tag = ""; this.buttonHintergrund.Text = "hell/dunkel"; this.buttonHintergrund.UseVisualStyleBackColor = true; @@ -654,7 +663,7 @@ this.buttonRander.Location = new System.Drawing.Point(434, 538); this.buttonRander.Name = "buttonRander"; this.buttonRander.Size = new System.Drawing.Size(95, 23); - this.buttonRander.TabIndex = 20; + this.buttonRander.TabIndex = 14; this.buttonRander.Tag = ""; this.buttonRander.Text = "Ränder"; this.buttonRander.UseVisualStyleBackColor = true; @@ -684,7 +693,7 @@ this.MinimumSize = new System.Drawing.Size(983, 605); this.Name = "Main"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Image Sorter v1.42 | © 2015-2019 by manuelkamper.com"; + this.Text = "Image Sorter v1.43 | © 2015-2020 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); @@ -762,5 +771,6 @@ private System.Windows.Forms.Button buttonRandUnten; private System.Windows.Forms.Button buttonRandOben; private System.Windows.Forms.TrackBar trackBarRander; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemShowEXIF; } } diff --git a/Mk0.Software.ImageSorter/Main.cs b/Mk0.Software.ImageSorter/Main.cs index dae8ef0..3b69fc2 100644 --- a/Mk0.Software.ImageSorter/Main.cs +++ b/Mk0.Software.ImageSorter/Main.cs @@ -620,7 +620,7 @@ namespace Mk0.Software.ImageSorter var result = form.ShowDialog(); if (result == DialogResult.Yes) { - fullTargetPath = Path.Combine(targetPath, Path.GetFileNameWithoutExtension(pictureBoxImage.ImageLocation) + Randomize.NumberAndDigits(5, "_") + Path.GetExtension(pictureBoxImage.ImageLocation)); + fullTargetPath = Path.Combine(targetPath, Path.GetFileNameWithoutExtension(pictureBoxImage.ImageLocation) + Randomize.NumbersAndDigits(5, "_") + Path.GetExtension(pictureBoxImage.ImageLocation)); } else if (result == DialogResult.No) { @@ -1060,7 +1060,7 @@ namespace Mk0.Software.ImageSorter } /// - /// Öffnet im Explorer den Ordner des Bildes + /// Öffnet im Explorer den Ordner des Bildes und legt den Fokus auf das aktuelle Bild, wenn es existiert /// /// /// @@ -1078,7 +1078,7 @@ namespace Mk0.Software.ImageSorter } /// - /// Zeigt Details zum Bild an + /// Zeigt Details (Eigenschaften) zum aktuellen Bild an /// /// /// @@ -1102,6 +1102,20 @@ namespace Mk0.Software.ImageSorter } } + /// + /// Zeigt die EXIF-Daten vom aktuellen Bild an + /// + /// + /// + private void ToolStripMenuItemShowEXIF_Click(object sender, EventArgs e) + { + using (Image img = Image.FromFile(pictureBoxImage.ImageLocation)) + { + EXIF exif = new EXIF(img.PropertyItems); + exif.ShowDialog(); + } + } + /// /// Öffnet Paint zum Bearbeiten des Bildes /// @@ -1144,16 +1158,12 @@ namespace Mk0.Software.ImageSorter } /// - /// Temporäre Dateien beim Beenden löschen + /// Größe, Position in Settings speichern vor dem Schließen /// /// /// private void Main_FormClosing(object sender, FormClosingEventArgs e) { - if (Directory.Exists("C:/img-tmp")) - { - Directory.Delete("C:/img-tmp", true); - } Properties.Settings.Default.lastPath = quellPath; Properties.Settings.Default.lastWidth = Width; Properties.Settings.Default.lastHeight = Height; @@ -1287,6 +1297,12 @@ namespace Mk0.Software.ImageSorter e.Handled = true; } + if (e.KeyCode == Keys.F6) + { + toolStripMenuItemShowEXIF.PerformClick(); + e.Handled = true; + } + if (e.KeyCode == Keys.Back) { buttonUndo.PerformClick(); @@ -1406,7 +1422,7 @@ namespace Mk0.Software.ImageSorter private void ButtonDuplicate_Click(object sender, EventArgs e) { //aktuelles bild kopieren - string targetPath = Path.Combine(Path.GetDirectoryName(pictureBoxImage.ImageLocation), Path.GetFileNameWithoutExtension(pictureBoxImage.ImageLocation) + Randomize.NumberAndDigits(5, "_") + Path.GetExtension(pictureBoxImage.ImageLocation)); + string targetPath = Path.Combine(Path.GetDirectoryName(pictureBoxImage.ImageLocation), Path.GetFileNameWithoutExtension(pictureBoxImage.ImageLocation) + Randomize.NumbersAndDigits(5, "_") + Path.GetExtension(pictureBoxImage.ImageLocation)); File.Copy(pictureBoxImage.ImageLocation, targetPath, true); //duplikat als nächstes bild in liste aufnehmen diff --git a/Mk0.Software.ImageSorter/Mk0.Software.ImageSorter.csproj b/Mk0.Software.ImageSorter/Mk0.Software.ImageSorter.csproj index aec1afd..4c214e2 100644 --- a/Mk0.Software.ImageSorter/Mk0.Software.ImageSorter.csproj +++ b/Mk0.Software.ImageSorter/Mk0.Software.ImageSorter.csproj @@ -9,7 +9,7 @@ Properties Mk0.Software.ImageSorter Image Sorter - v4.6.1 + v4.7.2 512 false Svn @@ -33,7 +33,7 @@ manuelkamper.com false 0 - 1.42.0.0 + 1.43.0.0 true true true @@ -77,24 +77,19 @@ - ..\..\Mk0.Tools.Password\Mk0.Tools.Password\Mk0.Tools.Password\mk0.gui.banner.1.0.0\lib\net461\Mk0.GUI.Banner.dll - True + ..\packages\mk0.gui.banner.1.0.0\lib\net461\Mk0.GUI.Banner.dll - ..\..\Mk0.Tools.Password\Mk0.Tools.Password\Mk0.Tools.Password\mk0.tools.calculation.1.0.0\lib\net461\Mk0.Tools.Calculation.dll - True + ..\packages\mk0.tools.calculation.1.0.0\lib\net461\Mk0.Tools.Calculation.dll - ..\..\Mk0.Tools.Password\Mk0.Tools.Password\Mk0.Tools.Password\mk0.tools.imagecropper.1.0.0\lib\net461\Mk0.Tools.ImageCropper.dll - True + ..\packages\mk0.tools.imagecropper.1.0.0\lib\net461\Mk0.Tools.ImageCropper.dll - - ..\..\Mk0.Tools.Password\Mk0.Tools.Password\Mk0.Tools.Password\mk0.tools.images.1.0.0\lib\net461\Mk0.Tools.Images.dll - True + + ..\packages\mk0.tools.images.1.0.4\lib\net461\Mk0.Tools.Images.dll - ..\..\Mk0.Tools.Password\Mk0.Tools.Password\Mk0.Tools.Password\mk0.tools.randomization.1.0.0\lib\net461\Mk0.Tools.Randomization.dll - True + ..\packages\mk0.tools.randomization.1.0.0\lib\net461\Mk0.Tools.Randomization.dll @@ -103,6 +98,7 @@ + @@ -111,6 +107,12 @@ Cropper.cs + + Form + + + EXIF.cs + Form @@ -135,6 +137,9 @@ Cropper.cs + + EXIF.cs + Main.cs @@ -169,11 +174,6 @@ - - - - - diff --git a/Mk0.Software.ImageSorter/Properties/AssemblyInfo.cs b/Mk0.Software.ImageSorter/Properties/AssemblyInfo.cs index 09d4cf4..2f5e051 100644 --- a/Mk0.Software.ImageSorter/Properties/AssemblyInfo.cs +++ b/Mk0.Software.ImageSorter/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("manuelkamper.com")] [assembly: AssemblyProduct("ImageSorter")] -[assembly: AssemblyCopyright("Copyright © 2015-2019 by manuelkamper.com")] +[assembly: AssemblyCopyright("Copyright © 2015-2020 by manuelkamper.com")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -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.42.*")] +[assembly: AssemblyVersion("1.43.*")] //[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 4547995..86e4290 100644 --- a/Mk0.Software.ImageSorter/Properties/Resources.Designer.cs +++ b/Mk0.Software.ImageSorter/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace Mk0.Software.ImageSorter.Properties { // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { diff --git a/Mk0.Software.ImageSorter/Properties/Settings.Designer.cs b/Mk0.Software.ImageSorter/Properties/Settings.Designer.cs index 75304e4..1f5ac93 100644 --- a/Mk0.Software.ImageSorter/Properties/Settings.Designer.cs +++ b/Mk0.Software.ImageSorter/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace Mk0.Software.ImageSorter.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.4.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/Mk0.Software.ImageSorter/dll/Mk0.GUI.Banner.dll b/Mk0.Software.ImageSorter/dll/Mk0.GUI.Banner.dll deleted file mode 100644 index 190af6eb97892d41867e0c2a3b0858686a8b3c48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeHMdu$x%ai4wM-tk0Hx+6tN@k1w47HEn(^A(G79a((IrY%YoNy)N9TiQFWsg>?- z&$~<8G{aUx64!F`hk*Q%I7wZ{MpC3Of&@qqCrAuOXaOf}0t1E71WEwKNQ$Ng>=?}h zQ5!11ncckyNi#{2Kl(@axU=*6=9_P3zS#%IAG|~w5$QOuUnhDQS3V93Tpyf=xM{~X zn&>MH-`n}Ja`<~Yr_b14rtCU%u360F%~HwnGdU~c&X+QFDKm0(DpPc3t?b5)$z7r8 ziBY1%ibhx4F8(f>?JBipHYnXh+rTjb?&W>BW^f+FNwisTHSn7mp&HS75a9En(dmz} zD*silA;~Np4(uLf?r3HFVaup724xwiN&} zS!?JwC^<4jr?al-=0S;X2Z3;+-iNd1I0)~vu2pcL$iC8PoNVi6oHfTmqM;g6&=)zb zIM_FpV${8x=#z+-BHTY6GLL$!nlYL|l9rG&U0oEoY`~!5wSezzVd08V z;6~(UDVnf-?P1Lu_*53Zc4?so@|b%;yXGp zSt6C#dnL5%?2v$Uo{i`*TAaN=*2($$EXQPJzQQzQIGiV~y5xNT=A>S$>0K{*57Z`a z&m9;n^RJn?)@2o$Yb14R2QrOG_B2qqg@{mIQeRjV_v;jCdaOzJuu~0GO(my>vy+$I zxt1$0MqP8$1v4fn8sVBc5W zlFG#THpKV;t7z1SIFF49XCrL4ENdvnR`|ocAmBM|ydc`sQsFj1(`gs3y2#BU;cTj~ z)I}(RgQj6PyI4tG1V76&Y;S)B4K&Cp_MOb;VGd&u|w8bw-^xtBaUI=PTAC zS9mH{xF=U+OYi(tr5|cbJOB-l_0a%Xog3gEP-ANqwaJP#?-n?_#C?EWK)2L8+f;2y z5HQd!1BM`AAlU&!kmo9Pb|gEb4piwK9Z~}-m_hP~rtTe5!n*_CYaZ**c4zy#`+D|s zUSm`M{1=3`{V&n1P#GgQ+oycjF3owY@gZI$uIU}Q!~fJ?G@9t0*e{^-EOgTJhVitPre~C=!TEcIJ-Gx= z4EiZx6Fh%E{P|Igt=$G|>^DC&@S6CynHmk<7!;i2`La-rv_WJ;8p~3Y7V57>mZoOf zNtcZ004KE<01w1I5BRXaBLWTmA28x!?Tdg7^ko^%a3g&cumx}@wJBfcu>wip1bq{n zvw-ciC-y2dKSHko{y^Xt0Vgu-`BU4PjeiFJ@J^;K(DT|AiqlWp0_wY<8t8vQ>Z_nO z&`X?PdWt5rH{rt%D%4xt3U>vv!@5FSs5zv5396OaL+S-kTd6;!o;0@Lf$Lr_82WJH zE#p_Hp~;Yn#hH3Aq@Ic~l?$l{mEVFo8&YMV+EA=@70BA??U4E*WNq}DkU9fdJ6#W{k3!Z?iQTdW%#JDss?fCqQ-U2`$eHQL}x}@55I;=Q>g{}SEEluUnhQagZ&!*95@lb2|5ZzaPww` zUWaDA{vTuKq<9s<25L4G@NB`I3s|4@p}O?GzqvH@LgJnoq*=+ z=nIW>#h3)VN6UlrGuVHZ{z*6!norNtOR>#>PbnV(e@7g9R_0a7q|ZhlMpgTQQ4ZJGCnBypx~zkH$%wM^MYRpA#r{?ss7vsAUeJZ>dHYcR z^>_xx&J}uv2=(o||_i{Hw(ymX~+!GUui$4B{apCar?` zgkWA(9@(C7QO9|IwP4sOFSz#HnKeblvRPWFj+vY<`KVBy6Z7Qkg6-ExWdqTO^(b#7 z8Z8A^lrN~F<$2f(9xRlw5u%L~8q9_vsgaDh=HpD7v$LnB?ff}fu{CO#)m>1_3=2MB zNm+%PiKL7p4|pw3$twBS=T?Do_#|ez6J`lG*X@c~D;tv7;(H3GEdM=a6{}UZ*RZ;l zFtWOqtZH@TMz4B0xJp#9xJqJ2orlKHb!YMTpB<9OWM>Nql2gDwEcq_3K?fwizHtR~ z)zOd+r;*4;ZASd75WJ44S5%l$&!{js_|hdRoUjp3T91T{n5KNE4BKdog?oJbS-k*1^A?FEl z%BRLk*zP9xf#^1R`KHTvwEybA#y@sj(}mxC<-jeZXA~u&Wk`tuNu`)$S1eCe)Jf0cS8d51!pk#51c8Rsa@G1X9U8OM1{ zHJWfSn4B7!diTxE*RD*@4PN^GmFNHFzu*5M zwmE#q%yAEQ(wU-Jnzv>=XWq?QGp<#3yqWr#tt6e?*%{e_D+Jl{Y>qy`E``UJ8P7yi z{Wbb5A8=0%JMKuKFph>2JRDk6hSUVtgWMz^dJd@I_>%rj7**ht4=o$~ zxiu_(Qgphp?%>x?IgSDT{lf7WhP@(w7DoG+B{&xPwH@uz_^j$I4js0G=b3*uD%{qH9hQ|jdVa8_YbEJIH zEx}%)#=G_A%hD`#`Rg8Mbvx`Fh7CMGfya?3(}JvE4sUhn5Nq%<^aaY`*9(7oXg{!G zxIWGfADysTYd6T?EaoX<9v9kClnGw*T8@Tuat7IxD5gwtX3%riiDB)U4oFTWV9&uy z=aCP;CNk^WVc+{D7xm*;W@KeP24u`2R^`bWb6CLw;_`>a@qB-_0|m|BasRQVG5y(W L|G%OC^AY$x97B#n diff --git a/Mk0.Software.ImageSorter/dll/Mk0.Tools.Calculation.dll b/Mk0.Software.ImageSorter/dll/Mk0.Tools.Calculation.dll deleted file mode 100644 index e61c03cd4334f73ad96d12833be212946af87130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 zcmeHKTWlOx8UAOz-Z)OYiQ~j-N(GZRRh`71?#5f!E-9?D8@q1p*km^*v@4p~+2hSL zb6I9)n`{waDp9GBN{J8^QUy;`RYipmMQT7GBqXG~RIS7VFFf>tOA(cLsHI9sBz*sw zncejzrFlef*7Kk9U(bIzH!nVUje3YEiSPDpq8sSBu1GOqtuj#0!qZXG+s_oW(VU1ii6+zW7*>+UmEob} zU~+8V9vX$i{obQ(rPNUGaT@GBb~rJ*k864CRO#_kN|Z&e$+I~vqfKNcveTT5Ua|oH zg!GJjooE@gTEjO|3Ov)P`z-M;>b!t{kUgeGIwsi2-+C%Db_t@xm6ZMgSs+z zAVE7B`KK~L!(k2Kja&-gOK%uYM`M_XJp75mW8OvU^k5=Iy25aj{-x}pC8(xonf|P# z=noR!knk~uDf=ZHm#{ABCuuKq@0IWsNqL^W14%1!6L5$azNXxi6Na;Lo)j$B=aqMq z89827*_)T?8_G%GONSVH;hvA68OGr!cG5@ic@Qu~2Lb!(DBxboN;oayjD+(NenG-7 zNvH!JAXARNB4JCy>m*R_>-6QsQF@VHRUV{of}SFccF_#r5Iqj~DQIdmLLT68dI@ks z!p}-rkn|_$yP%gOse-%if*%N37Tt~wV41br`ikz6-BjKuj^oRXa(0^F@19bZN~S7UA0>)Kqu$5788!gYQU)+{uH*}}f(K*|60@D^eC+4Y|mKk($ z=MXuM=&O{WN3ah@u%a1$jcA8Tb9}|1UyS-E zxF6V{N&5GO-_ZJ27jC@t?e#+b$NMO$DoS6EN=h#VgM*Bw86^64q|ynrbT1{+X`F+A zX$YqK-g>UGaxnMai%C+_1AR(#*M6E0l5%4Bi=N&%<2t9W7(%Y8@?@GlA&;DU z6*{nOjc_ze0T?>iUOnn>Usu%=ne4P`qpnC09aZRv@z9A}Zn9PzpUzgrcrNpBcD!26 ziE$%0IW?K7oe-PS^oaRSKs780^bktt>c}tE-wM5hHcX`fXrPWtimuVLg%kJ{oE}ZxQcFRzX1bh-hb!1~yh!}YwrRWr z)vZ2Lkt=U|zSgK!=@-$1gkAqVk5wLRZSlh;ZTJOkV44q7U|u-A7(bE zVXMvmc?#dcME8WR=&o$=wj%6zTI(WWDEEqdJD$%IUF~{5U+u|(zk)mPX~5HT7NdE* zw9f#a2b>LG-Sq3^KW>F~LR+!T&qovSeaLIOyYU-HfmI!M?JRC%3n$V%IkZZy6gwhs z(K5I?s6O~QPAwB$Co=QXXI&x81O^HOymU9uLxS_K7MouBB*B zt}J^JuM)<%VmOLFac(>DEy%hp!?ufp$tqB;E9-_<|2cQW>W`hQyn{tbHCy!8M8 diff --git a/Mk0.Software.ImageSorter/dll/Mk0.Tools.ImageCropper.dll b/Mk0.Software.ImageSorter/dll/Mk0.Tools.ImageCropper.dll deleted file mode 100644 index ad247dedce259af986194d3b0d8c1faf2c713fe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 diff --git a/Mk0.Software.ImageSorter/dll/Mk0.Tools.Randomization.dll b/Mk0.Software.ImageSorter/dll/Mk0.Tools.Randomization.dll deleted file mode 100644 index 784758a241530f5841206c87c403c29c1bd25ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 zcmeHLZ)hCH760wtNjk~##b^1SQny*lPI0X0I9ZBp)oCnQCpn5OS<#&pI~CY_ck9#I zd%Ne|J==02bqf7sN=q6-iK)MZVnS1BXdx!hKnsOZ@Rt_SB(x+gE%Ap!3k_{4A@1+Z z-bp9RO7MsNfp*UOn|bfeym{}<%$t!XpL!NC0C9e|ZUNU>OBq)9(Qt|4_r9?Hbu5Iiup0tn}Ko9Xsl(r^kT9S`1s? zN&T`h+q>vC)@T{v9&%bE?sGk?4SvJ?fOV>^M|KON-VL}!f_y14ocxk>m48chofHvoe;#Q;vG z{lG7hQnn4VAq$n{*HngSecHDij~yjsILS|Rt>@QNhJgc3q-q8dR~E5NM+=N@AWOqF z#l3sz%*63E4&(R~p1v38=m;48jx|0x)q8>z+iPR~0*Re8ucI@bia*qWwwTvR>eJZN z+0t`=TcSPTZ6NJ!6xbxNS;VQ9&Br=hQZ4$2@y^y%YwsKJCQWUrHqjKXYijeha7bsO z2dTs^tZvum|4Z$9=Ravzx4yHB(Zj9-xyKJ^_1z$Q>)b#(lkU&-_YKM3Xn{lgD)-v< zr-Aob|5@6((6`-kAU%HH!oACS`_UYJ%|j|jar?oe6Is@OBz=tAV*3HdE0C7L;o8AZ z>S!0@A6h@S__7zdJJgnz?JqJ~r_Q__1(7#C;B`&fB7Gkh^j4Uf;7*L|_u>VrZ^bma z$oZAR>k1#!gtI|mufnq8KZ4`r->2}~it|NW)>`pn{cYlI{RXAK)ujC$qRbl2EfLe` z>lZXlA5raTL!{rrEBZ0gH|x}Eq~f@=Et2(+YQyGkp}xFjn7TXI((tObZk>+55M#K> z2|k|Fj$vKn0Tdlw#11@2T!%h|LkdR}PAGgr;cL#KCJj-cm^+OhlnyNsa7tDwe%_p9&MtmV-ga8Bpx89 zu?8oIotP(n0$(9+$Fsy9e2>_#aG%0a#Xp1}ke^eW&nYb87v!A52gCsF+I@&$YOD;W zP(|ZTkiFC>M^voq)FYE#speRZq7oE6-?0lAsa7qwgo8D^G!k-m7iyt}tW~I$%Vxo` zmUyFHW!4VtWxSCfuqp*-A#aDxT^HHDS+Xjoe`ZNb-t@~>IL=$tI`1_L8e_(7$C|bL z!1mmwQ4Qg!=bp05HQx;HD9&0z(YLG1g|xeBJ8Hy?<(L;#D_E&}+Gl8r;Yz`%S6%S! z^86h|m8$73ERC6|xuIRLWKPagupK*WmYQzKtJoJUQ;=nrL0}H!vIGLr)eLis=P!&8^XQOx2= z9K&%u1rr4nQG$h2DDwo{IL&kDpaK^jsyGXuCo)70=Wt$*WbxlH%f>r-CvLy_O7)Gm z-}>&sZ=5~7`wu^Ty&G{u(-JWQS_>Pgl#odQeQjHNa{X9x{e+&-^`zdKYys;eyOGNQ z3HC||#1e`ZBQKeF_2S%Y*TB1%TMOwg`%ZSV}9QE z&IcO%wW(`ltA@?1ZAG-GE>zXEc=C*&ykr==Gkrrwg=fIz^YTFrI|>i?5A_WW4)hKV zTDyA(iUU?}p;$6|Gkb>$0|SGFp-le(-;JEKk5@Z?z@&z)>8Y{&Vgh=oe)K-e>whra zN9&Ut7KK?ms5<7t6qD5k8D%U=4AomgjluoDc~5GlUA)NeD&Nyr)niq-QBlwI2ElqJ zm(Bex{c_^#H`h&Ed-Qid-|^SfHSv1%Gjm4+Ccn9g>DH{dtXHg6EH@11n0dLkja*nO z*`7pV&m8lWoP}U+l|Zh__X?-y)PY;AN4i=npj>}Gi`CCa+mP1E(s*V^k`tqzpLLu` z({`gP#JY%m)SYV+?nAU zCeN8XdJ(WaqjZ+k+%_&Q^DM*svZQyGdL`Q~`Q69yqA&WmX4uO961hj~l0g*#IN@KZED@H5mV||Cb{0Pb{S= A$N&HU diff --git a/Mk0.Software.ImageSorter/packages.config b/Mk0.Software.ImageSorter/packages.config index 89395d6..4d8ece7 100644 --- a/Mk0.Software.ImageSorter/packages.config +++ b/Mk0.Software.ImageSorter/packages.config @@ -1,8 +1,8 @@  - - - - - + + + + + \ No newline at end of file