From e912b701fcc68c6033197bf65aa10ddac5456f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6ksel=20K=C3=BC=C3=A7=C3=BCk=C5=9Fahin?= Date: Thu, 21 Jan 2021 01:54:56 +0300 Subject: [PATCH 1/2] Add files via upload --- SteinbergDithering/Dithering.cs | 193 ++++++++++--------- SteinbergDithering/Error.cs | 22 +++ SteinbergDithering/Form1.Designer.cs | 61 +++--- SteinbergDithering/Form1.cs | 113 +++++++---- SteinbergDithering/SteinbergDithering.csproj | 1 + 5 files changed, 228 insertions(+), 162 deletions(-) create mode 100644 SteinbergDithering/Error.cs diff --git a/SteinbergDithering/Dithering.cs b/SteinbergDithering/Dithering.cs index a27ced7..58977dc 100644 --- a/SteinbergDithering/Dithering.cs +++ b/SteinbergDithering/Dithering.cs @@ -6,6 +6,7 @@ using System.Drawing.Imaging; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -13,129 +14,141 @@ namespace SteinbergDithering { class Dithering { - private static Bitmap image; //main image - private static Bitmap bmp; //target image - - private static float errR; //error of Red - private static float errG; //error of Green - private static float errB; //error of Blue - - public static Bitmap Make(Bitmap original, int factor, bool isBlackWhite) + /* REFORMATTED*/ + public static byte[,,] Make(byte[,,] original, int factor, bool isGrayScale) { - SetImage(original); - if(isBlackWhite) + if (original != null) { - image = PaintItBlack(image); - } - return Dither(image, factor); - } - - private static void SetImage(Bitmap img) - { - if (img != null) - { - //if not null - image = img; - bmp = (Bitmap)image.Clone(); + byte[,,] clonedArray = (byte[,,])original.Clone(); + if (isGrayScale) + { + clonedArray = ConvertToGrayScale(clonedArray); + } + return Dither(clonedArray, factor); } else { - //if null throw exception. throw new NullReferenceException(); } } - private static Bitmap GetImage() + private static byte[,,] Dither(byte[,,] ditherImage, int factor) { - return bmp; - } - - private static Bitmap Dither(Bitmap ditherImage, int factor) - { - for (int y = 0; y < ditherImage.Height - 1; y++) + for (int y = 0; y < ditherImage.GetLength(0) - 1; y++) { - for (int x = 1; x < ditherImage.Width - 1; x++) + for (int x = 1; x < ditherImage.GetLength(1) - 1; x++) { - Color pix = ditherImage.GetPixel(x, y); - float oldR = pix.R; - float oldG = pix.G; - float oldB = pix.B; - // - byte newR = (byte)(Math.Round(factor * oldR / 255) * (255 / factor)); - byte newG = (byte)(Math.Round(factor * oldG / 255) * (255 / factor)); - byte newB = (byte)(Math.Round(factor * oldB / 255) * (255 / factor)); + //Color pix = ditherImage.GetPixel(x, y); + byte oldR = ditherImage[y, x, 0]; // R + byte oldG = ditherImage[y, x, 1]; // G + byte oldB = ditherImage[y, x, 2]; // B // - ditherImage.SetPixel(x, y, Color.FromArgb(newR, newG, newB)); + byte newR = (byte)(Math.Round(factor * oldR / 255.0) * (255 / factor)); + byte newG = (byte)(Math.Round(factor * oldG / 255.0) * (255 / factor)); + byte newB = (byte)(Math.Round(factor * oldB / 255.0) * (255 / factor)); // - errR = oldR - newR; - errG = oldG - newG; - errB = oldB - newB; + ditherImage[y, x, 0] = newR; + ditherImage[y, x, 1] = newG; + ditherImage[y, x, 2] = newB; // - SetPx(ditherImage, x + 1, y, 7); + Error err = new Error(oldR - newR, oldG - newG, oldB - newB); // - SetPx(ditherImage, x - 1, y + 1, 3); - // - SetPx(ditherImage, x, y + 1, 5); - // - SetPx(ditherImage, x + 1, y + 1, 1); + SetPx(ditherImage, x + 1, y, 7, err); + SetPx(ditherImage, x - 1, y + 1, 3, err); + SetPx(ditherImage, x, y + 1, 5, err); + SetPx(ditherImage, x + 1, y + 1, 1, err); } } return ditherImage; } - private static void SetPx(Bitmap bmap, int x, int y, int factor) + private static void SetPx(byte[,,] img, int x, int y, int quant, Error err) { - //Color c = kitten.GetPixel(x + 1, y); - Color c = bmap.GetPixel(x, y); - float r = c.R; - float g = c.G; - float b = c.B; + double r = img[y, x, 0]; // R + double g = img[y, x, 1]; // G + double b = img[y, x, 2]; // B + // + r += err.r * (quant / 16.0); + g += err.g * (quant / 16.0); + b += err.b * (quant / 16.0); + // + img[y, x, 0] = CheckSize(r); + img[y, x, 1] = CheckSize(g); + img[y, x, 2] = CheckSize(b); + } - r = r + (float)(errR * (factor / 16.0)); - g = g + (float)(errG * (factor / 16.0)); - b = b + (float)(errB * (factor / 16.0)); - if (r < 0) - { - r = 0; - } - else if (r > 255) - { - r = 255; - } - if (g < 0) - { - g = 0; - } - else if (g > 255) - { - g = 255; - } - if (b < 0) + private static byte[,,] ConvertToGrayScale(byte[,,] imgArr) + { + // R' = G' = B' = 0.299R + 0.587G + 0.114B + if (imgArr != null) { - b = 0; + byte[,,] gray = new byte[imgArr.GetLength(0), imgArr.GetLength(1), 3]; + for (int i = 0; i < imgArr.GetLength(0); i++) + { + for (int j = 0; j < imgArr.GetLength(1); j++) + { + byte grayScale = CheckSize(0.299 * imgArr[i, j, 0] + 0.587 * imgArr[i, j, 1] + 0.114 * imgArr[i, j, 2]); + gray[i, j, 0] = grayScale; + gray[i, j, 1] = grayScale; + gray[i, j, 2] = grayScale; + } + } + return gray; } - else if (b > 255) + return null; + } + + private static byte CheckSize(double input) => CheckSize((int)Math.Round(input)); + + private static byte CheckSize(int input) => (input < 0) ? (byte)0 : ((input > 255) ? (byte)255 : (byte)input); // Looks nice but readablity sucks at this form :( + + public static byte[,,] GetImageArray(Bitmap bmp) + { + Bitmap cloneBMP = (Bitmap)bmp.Clone(); + if (cloneBMP != null) { - b = 255; + int _bmpHeight = cloneBMP.Height; + int _bmpWidth = cloneBMP.Width; + if (_bmpWidth > 10 && _bmpHeight > 10) + { + byte[,,] arr = new byte[_bmpHeight, _bmpWidth, 3]; + for (int i = 0; i < _bmpHeight; i++) + { + for (int j = 0; j < _bmpWidth; j++) + { + // For every pixel + arr[i, j, 0] = cloneBMP.GetPixel(j, i).R; // Red + arr[i, j, 1] = cloneBMP.GetPixel(j, i).G; // Green + arr[i, j, 2] = cloneBMP.GetPixel(j, i).B; // Blue + } + } + //while (t1.IsAlive) ; + return arr; + } } - c = Color.FromArgb((byte)r, (byte)g, (byte)b); - bmap.SetPixel(x, y, c); + return null; } - private static Bitmap PaintItBlack(Bitmap bitmap) + public static Bitmap GetBitmapFromArray(byte[,,] imgArray) { - Bitmap black = (Bitmap)bitmap.Clone(); - for (int i = 0; i < black.Width; i++) + if (imgArray != null) { - for (int x = 0; x < black.Height; x++) + int _height = imgArray.GetLength(0); + int _width = imgArray.GetLength(1); + if (_height > 1 && _width > 1 && imgArray.GetLength(2) == 3) { - Color oc = black.GetPixel(i, x); - int grayScale = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11)); - Color nc = Color.FromArgb(oc.A, grayScale, grayScale, grayScale); - black.SetPixel(i, x, nc); + Bitmap bmp = new Bitmap(_width, _height); + for (int y = 0; y < _height; y++) + { + for (int x = 0; x < _width; x++) + { + bmp.SetPixel(x, y, Color.FromArgb(255, imgArray[y, x, 0], imgArray[y, x, 1], imgArray[y, x, 2])); + } + } + return bmp; } } - return black; + throw new NullReferenceException("Array is Null!"); } } -} +} \ No newline at end of file diff --git a/SteinbergDithering/Error.cs b/SteinbergDithering/Error.cs new file mode 100644 index 0000000..e6a051f --- /dev/null +++ b/SteinbergDithering/Error.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SteinbergDithering +{ + class Error + { + public int r; + public int g; + public int b; + + public Error(int r, int g, int b) + { + this.r = r; + this.g = g; + this.b = b; + } + } +} diff --git a/SteinbergDithering/Form1.Designer.cs b/SteinbergDithering/Form1.Designer.cs index 6a5d163..a6f0d3e 100644 --- a/SteinbergDithering/Form1.Designer.cs +++ b/SteinbergDithering/Form1.Designer.cs @@ -32,10 +32,10 @@ private void InitializeComponent() this.buttonLoad = new System.Windows.Forms.Button(); this.buttonDither = new System.Windows.Forms.Button(); this.buttonSave = new System.Windows.Forms.Button(); - this.trackBar1 = new System.Windows.Forms.TrackBar(); - this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.factorSlider = new System.Windows.Forms.TrackBar(); + this.isGrayScaleCheckbox = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxView)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.factorSlider)).BeginInit(); this.SuspendLayout(); // // pictureBoxView @@ -63,7 +63,7 @@ private void InitializeComponent() this.buttonLoad.TabIndex = 1; this.buttonLoad.Text = "Load"; this.buttonLoad.UseVisualStyleBackColor = true; - this.buttonLoad.Click += new System.EventHandler(this.buttonLoad_Click); + this.buttonLoad.Click += new System.EventHandler(this.ButtonLoad_Click); // // buttonDither // @@ -78,7 +78,7 @@ private void InitializeComponent() this.buttonDither.TabIndex = 2; this.buttonDither.Text = "Dither"; this.buttonDither.UseVisualStyleBackColor = true; - this.buttonDither.Click += new System.EventHandler(this.buttonDither_Click); + this.buttonDither.Click += new System.EventHandler(this.ButtonDither_Click); // // buttonSave // @@ -93,39 +93,40 @@ private void InitializeComponent() this.buttonSave.TabIndex = 3; this.buttonSave.Text = "Save"; this.buttonSave.UseVisualStyleBackColor = true; - this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click); + this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); // - // trackBar1 + // factorSlider // - this.trackBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + this.factorSlider.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.trackBar1.AutoSize = false; - this.trackBar1.Location = new System.Drawing.Point(112, 497); - this.trackBar1.Maximum = 5; - this.trackBar1.Minimum = 1; - this.trackBar1.Name = "trackBar1"; - this.trackBar1.Size = new System.Drawing.Size(268, 37); - this.trackBar1.TabIndex = 4; - this.trackBar1.TickStyle = System.Windows.Forms.TickStyle.Both; - this.trackBar1.Value = 2; - this.trackBar1.Scroll += new System.EventHandler(this.trackBar1_Scroll); + this.factorSlider.AutoSize = false; + this.factorSlider.Location = new System.Drawing.Point(112, 497); + this.factorSlider.Maximum = 5; + this.factorSlider.Minimum = 1; + this.factorSlider.Name = "factorSlider"; + this.factorSlider.Size = new System.Drawing.Size(268, 37); + this.factorSlider.TabIndex = 4; + this.factorSlider.TickStyle = System.Windows.Forms.TickStyle.Both; + this.factorSlider.Value = 2; + this.factorSlider.Scroll += new System.EventHandler(this.FactorSlider_Scroll); // - // checkBox1 + // isGrayScaleCheckbox // - this.checkBox1.AutoSize = true; - this.checkBox1.Location = new System.Drawing.Point(390, 510); - this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(15, 14); - this.checkBox1.TabIndex = 5; - this.checkBox1.UseVisualStyleBackColor = true; + this.isGrayScaleCheckbox.AutoSize = true; + this.isGrayScaleCheckbox.Location = new System.Drawing.Point(390, 510); + this.isGrayScaleCheckbox.Name = "isGrayScaleCheckbox"; + this.isGrayScaleCheckbox.Size = new System.Drawing.Size(15, 14); + this.isGrayScaleCheckbox.TabIndex = 5; + this.isGrayScaleCheckbox.UseVisualStyleBackColor = true; + this.isGrayScaleCheckbox.CheckedChanged += new System.EventHandler(this.IsGrayScale_Changed); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(628, 543); - this.Controls.Add(this.checkBox1); - this.Controls.Add(this.trackBar1); + this.Controls.Add(this.isGrayScaleCheckbox); + this.Controls.Add(this.factorSlider); this.Controls.Add(this.buttonSave); this.Controls.Add(this.buttonDither); this.Controls.Add(this.buttonLoad); @@ -137,7 +138,7 @@ private void InitializeComponent() this.Text = "JellyBeanci Steinberg Dithering"; this.Load += new System.EventHandler(this.Form1_Load); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxView)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.factorSlider)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -149,8 +150,8 @@ private void InitializeComponent() private System.Windows.Forms.Button buttonLoad; private System.Windows.Forms.Button buttonDither; private System.Windows.Forms.Button buttonSave; - private System.Windows.Forms.TrackBar trackBar1; - private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.TrackBar factorSlider; + private System.Windows.Forms.CheckBox isGrayScaleCheckbox; } } diff --git a/SteinbergDithering/Form1.cs b/SteinbergDithering/Form1.cs index 11ac80e..93566e5 100644 --- a/SteinbergDithering/Form1.cs +++ b/SteinbergDithering/Form1.cs @@ -9,83 +9,112 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.IO; +using System.Threading; namespace SteinbergDithering { public partial class Form1 : Form { - public Form1() - { - InitializeComponent(); - } - string title = "JellyBeanci Steinberg Dithering "; - int factor; - OpenFileDialog od = new OpenFileDialog(); - Bitmap bmp; - Bitmap image; - Bitmap dithered; - bool openFile = false; + // + #region GLOBAL VARIABLES + static readonly string TITLE = "JellyBeanci Steinberg Dithering "; + static OpenFileDialog od = new OpenFileDialog(); + static Graphics g = null; + static bool isGrayScale = false; + static Bitmap image = null; + byte[,,] imageArray = null; + byte[,,] ditheredArray = null; + static int factor; + //static int factor; + static Bitmap bmp; + //static Bitmap image; + #endregion + // + //Bitmap dithered; + // bool openFile = false; + + public Form1() => InitializeComponent(); + private void Form1_Load(object sender, EventArgs e) { od.Filter = "Image Files(*.bmp;*.jpg;*.png)|*.BMP;*.JPG;*.PNG"; od.DefaultExt = ".png"; - this.factor = trackBar1.Value; - this.Text = title + "Factor: " + factor.ToString(); + factor = factorSlider.Value; + SetTitle(factor); } - private void buttonLoad_Click(object sender, EventArgs e) + private void SetTitle(int factor) { - if (od.ShowDialog() == DialogResult.OK) - { - image = new Bitmap(od.FileName); - if (image != null) - { - this.pictureBoxView.Image = image; - openFile = true; - buttonDither.Enabled = true; - dithered = (Bitmap)image.Clone(); - bmp = (Bitmap)image.Clone(); - } - } + this.Text = TITLE + "Factor: " + factor.ToString(); } - private void buttonDither_Click(object sender, EventArgs e) + private void DitherThreadMethod() { - buttonDither.Enabled = false; - dithered = Dithering.Make(image, factor, checkBox1.Checked); - if (dithered != null) + ditheredArray = Dithering.Make(imageArray, factor, isGrayScale); + if (ditheredArray != null) { - //pictureBoxView.Image = dithered; - Draw(); - buttonSave.Enabled = true; + new Thread(Draw).Start(); } } - Graphics g; + private void Draw() { - g = Graphics.FromImage(bmp); + g = Graphics.FromImage(image); g.Clear(Color.White); - //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //AA - g.DrawImage(dithered, 0, 0, dithered.Width, dithered.Height); //print original here + bmp = Dithering.GetBitmapFromArray(ditheredArray); + g.DrawImage(bmp, 0, 0, image.Width, image.Height); //print original here pictureBoxView.Image = bmp; g.Dispose(); } - private void buttonSave_Click(object sender, EventArgs e) + private void SaveFile() { if (bmp != null) { string name = DateTime.Now.ToLongTimeString().Replace('.', ' ').Replace(':', ' '); bmp.Save(name + ".bmp", ImageFormat.Bmp); - buttonSave.Enabled = false; MessageBox.Show("Dosya " + name + " ismi ile kayıt edildi", "Başarılı!", MessageBoxButtons.OK, MessageBoxIcon.Information); } } - private void trackBar1_Scroll(object sender, EventArgs e) + // EVENTS + private void ButtonLoad_Click(object sender, EventArgs e) + { + if (od.ShowDialog() == DialogResult.OK) + { + image = new Bitmap(od.FileName); + if (image != null) + { + this.pictureBoxView.Image = image; + this.imageArray = Dithering.GetImageArray(image); + buttonDither.Enabled = true; + } + } + } + + private void ButtonDither_Click(object sender, EventArgs e) + { + buttonDither.Enabled = false; + buttonSave.Enabled = true; + new Thread(DitherThreadMethod).Start(); + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + new Thread(SaveFile).Start(); + this.buttonSave.Enabled = false; + } + + private void FactorSlider_Scroll(object sender, EventArgs e) + { + buttonDither.Enabled = true; + SetTitle(factorSlider.Value); + factor = factorSlider.Value; + } + + private void IsGrayScale_Changed(object sender, EventArgs e) { - this.factor = trackBar1.Value; - this.Text = title + "Factor: " + factor.ToString(); + isGrayScale = this.isGrayScaleCheckbox.Checked; } } } diff --git a/SteinbergDithering/SteinbergDithering.csproj b/SteinbergDithering/SteinbergDithering.csproj index 320e670..e25a536 100644 --- a/SteinbergDithering/SteinbergDithering.csproj +++ b/SteinbergDithering/SteinbergDithering.csproj @@ -47,6 +47,7 @@ + Form From 0385da4d68b49e155d5cb742458db4f4932ffab0 Mon Sep 17 00:00:00 2001 From: Jellybeanci Date: Thu, 21 Jan 2021 01:58:33 +0300 Subject: [PATCH 2/2] Removing unnecessary binary files. --- .../DesignTimeResolveAssemblyReferences.cache | Bin 831 -> 0 bytes ...signTimeResolveAssemblyReferencesInput.cache | Bin 7284 -> 0 bytes .../Debug/SteinbergDithering.Form1.resources | Bin 180 -> 0 bytes ...bergDithering.Properties.Resources.resources | Bin 180 -> 0 bytes ...bergDithering.csproj.CoreCompileInputs.cache | 1 - ...einbergDithering.csproj.FileListAbsolute.txt | 10 ---------- ...nbergDithering.csproj.GenerateResource.cache | Bin 1012 -> 0 bytes ...nbergDithering.csprojAssemblyReference.cache | Bin 11490 -> 0 bytes .../obj/Debug/SteinbergDithering.exe | Bin 12288 -> 0 bytes .../obj/Debug/SteinbergDithering.pdb | Bin 36352 -> 0 bytes 10 files changed, 11 deletions(-) delete mode 100644 SteinbergDithering/obj/Debug/DesignTimeResolveAssemblyReferences.cache delete mode 100644 SteinbergDithering/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache delete mode 100644 SteinbergDithering/obj/Debug/SteinbergDithering.Form1.resources delete mode 100644 SteinbergDithering/obj/Debug/SteinbergDithering.Properties.Resources.resources delete mode 100644 SteinbergDithering/obj/Debug/SteinbergDithering.csproj.CoreCompileInputs.cache delete mode 100644 SteinbergDithering/obj/Debug/SteinbergDithering.csproj.FileListAbsolute.txt delete mode 100644 SteinbergDithering/obj/Debug/SteinbergDithering.csproj.GenerateResource.cache delete mode 100644 SteinbergDithering/obj/Debug/SteinbergDithering.csprojAssemblyReference.cache delete mode 100644 SteinbergDithering/obj/Debug/SteinbergDithering.exe delete mode 100644 SteinbergDithering/obj/Debug/SteinbergDithering.pdb diff --git a/SteinbergDithering/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/SteinbergDithering/obj/Debug/DesignTimeResolveAssemblyReferences.cache deleted file mode 100644 index 9768334b3336eb2fccf4fa5365ded2228d74cc10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 831 zcmcIi-EPw`6n691B;}$Hz(tUD0a|4xDjfr;zxs4yNZz9mW($`kN3 zJPZ%P74HB(WegY6NCr zR4_`;Kxr=9X*Qu5O=&tx@=lme!L)_WC?-b9X}1)-d=8t1TtPcsrsH~2Kd7^;nxt&Z zd?dTGn`6Gw2Aa8H1~4nCxq$7>z5V0Kst^K7VJJP`!6CG$mT$lL%Al$`u^0U_7 z4$UWj)&KhX@G&+J$0$DX5PS)<2VGp7Tg+@eyq9WK&{t0vzi#XM^nhl?QCWi4e8~kj8(Ikwpg;eI>&lELp!s== zTtn<~`|Cm*M3Ds_qy207f6U)+v$2m3Z07>yx{a(nyH^fty$UXLpmA=rugn^hQ@57I sae5>Qd&ovEKYr?e`5fYa#c>?Ocv?SFI!?#gL()SbsN-hh;6~!$J6hoI*#H0l diff --git a/SteinbergDithering/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/SteinbergDithering/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache deleted file mode 100644 index f8044c7e1360b944b2820f674f9781bb6d462e72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7284 zcmeHM+fo}x5S6%$5g5lJ4z}@4PMpL}l#OHzHm>5qK`17%DN4dPRfxi)-If^Gol$0H z0fpjQ@&&1UV$!|3akG;LZ50n%O08ioeWrVRc2Bnw$wVUY4_@?5*VQ2u-do{nWmL^N z8^VO#FWb-)%2`rDpyWznIh)x4ZG@7G`8g*?f7#4Z=-W`kqJ+?D?q@S=VbvGzuh3jq zdmtC9x!KxW?RhPq_vUhZmX8wTi;p1v6bj!XycKCdtHyiH8x7D-iR%^F2(7t|i*Iw^ zR|nv|G6sUG-&{VlAZb@-5@#s;5tc9)gIssX!-O3Wismr6qcY8+j$B8|oU^>)`%{N1M~wbZqy z-V_(BxOcAqBq05>*wo3Q*}TYPzO7y^&kk5F2JJkr+lf zluRZWeo!Wc{v0hgjfDWi6YsBUDd3!+L4p>p^9G&uA-}o#i79v@Hn<rzsBQmprEWe1HZ48b=Hb0<>Q*&aEWz;M6dR@ze-4M@b+ZNTjZyz^^e9DH7u( zCQyvCt0)s}5=G&t)MidE%SfaTxQ0rX>{guB<@GLy%l=$SUZ1LD(JSA+ml^m#Xeo3Q!H}C=K$^ zb>vDVFv{QW65}2*a$N52KAzK7X00JY zx{pZvu^7}wDsamk5*QP`6f?qp5Vw^PHido$k#=LX5*og01|V%@*+azJjuVfJ`Vv9v zae@>y$7e`Avgj)W+ldow6|D2x+SW09glIvWXzzve)PZq|N(Uw~@N0y0UFL(r5#i)XOB_5i{%lYrmQByc!G_QB38PS zl;K2a&&kasDdjoWo2DFyt~BLAv|si;id#oZ7na_SSr$j9j$R9Csn|+Y*cCiH$Lt5} zpE+8;xUSqhW)6<`C$;(!HBBCs_yG}asyrXF9Cr1M;#Y-iXIp7Xq9~tac@**7KlT(= rZ^aTCMecGB^Nw_sq#?|eC>|(S=ois@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh diff --git a/SteinbergDithering/obj/Debug/SteinbergDithering.Properties.Resources.resources b/SteinbergDithering/obj/Debug/SteinbergDithering.Properties.Resources.resources deleted file mode 100644 index 6c05a9776bd7cbae976fdcec7e3a254e93018279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh diff --git a/SteinbergDithering/obj/Debug/SteinbergDithering.csproj.CoreCompileInputs.cache b/SteinbergDithering/obj/Debug/SteinbergDithering.csproj.CoreCompileInputs.cache deleted file mode 100644 index 1bef564..0000000 --- a/SteinbergDithering/obj/Debug/SteinbergDithering.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -43f24c64c50a37f0006fac249907e21b314e15c7 diff --git a/SteinbergDithering/obj/Debug/SteinbergDithering.csproj.FileListAbsolute.txt b/SteinbergDithering/obj/Debug/SteinbergDithering.csproj.FileListAbsolute.txt deleted file mode 100644 index a67571b..0000000 --- a/SteinbergDithering/obj/Debug/SteinbergDithering.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,10 +0,0 @@ -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\bin\Debug\SteinbergDithering.exe.config -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\bin\Debug\SteinbergDithering.exe -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\bin\Debug\SteinbergDithering.pdb -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\obj\Debug\SteinbergDithering.csprojAssemblyReference.cache -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\obj\Debug\SteinbergDithering.Form1.resources -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\obj\Debug\SteinbergDithering.Properties.Resources.resources -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\obj\Debug\SteinbergDithering.csproj.GenerateResource.cache -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\obj\Debug\SteinbergDithering.csproj.CoreCompileInputs.cache -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\obj\Debug\SteinbergDithering.exe -C:\Users\Jellybeanci\source\repos\SteinbergDithering\SteinbergDithering\obj\Debug\SteinbergDithering.pdb diff --git a/SteinbergDithering/obj/Debug/SteinbergDithering.csproj.GenerateResource.cache b/SteinbergDithering/obj/Debug/SteinbergDithering.csproj.GenerateResource.cache deleted file mode 100644 index 3910e33eac409b77ec4dc915bc75531486016a36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1012 zcma)4!D`z;5S3y{v1BK;4<(fL;FcZ=Ho_v97J@0*!EI;)X&pijrDdfZ(Zy@6*p0E@8hy#y8|XeCiA*b_avM)dA$fel z%)-P|rD4!J1#N^X#>ps7;$b`-^roe>rG{|m_bmPfkyO%5wy@nGo_bFjB9cpwDJB31*||@+>cMV zQmWJ$m@3_&>eT?Z@DLJrhl-MQs4$sNxukwK?rvxwL)CWD-)PC}RWv)-d$guK?C0nT zwuHyG;*uGAq`1fh@Q1f@a4w8B0dB~aTebZFNkY=R__gyn5{O_y?{|L?_* P-%ZMO2~O6f99iohv+x%` diff --git a/SteinbergDithering/obj/Debug/SteinbergDithering.csprojAssemblyReference.cache b/SteinbergDithering/obj/Debug/SteinbergDithering.csprojAssemblyReference.cache deleted file mode 100644 index bc78443a7f0a6557187751740a4448a42dc4e8a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11490 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 diff --git a/SteinbergDithering/obj/Debug/SteinbergDithering.exe b/SteinbergDithering/obj/Debug/SteinbergDithering.exe deleted file mode 100644 index d55b3d06571a22f23c9545638726f03145ad79d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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 diff --git a/SteinbergDithering/obj/Debug/SteinbergDithering.pdb b/SteinbergDithering/obj/Debug/SteinbergDithering.pdb deleted file mode 100644 index 26afab4ec7753adf7e2a5dc5db33f428bbda61f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36352 zcmeI53v^Z0na9t)gvcvM!b3#S3k2k4NO(&TfdmXl5PA7Zg%B=qA>`ss5O6xv1JY^h zYtV76(X~3RI#tV5J7rbZOnr?w%i7U89cQ#1y6m#naa?q2D_A?)8I<|`_v7Xy1SIvQ z3&`F0-TygzfBV~ef8T!ZePT_jK9g=ruWL?JPN*C=E>W{=eqvf#d3jNV)W+#_h0|{b;avmEq-Qf5PZ~Q!87j;8hrGIZ}qGB@`vdK z^|wr3J;3#W<-cCA;+E>?p8Mgvn=k!%@OdxZwWwzNnb19+>1D{3{re`XgMaPy^Dp0Y z=|lGr`h|8VP_hpImQkA@}J|NQk_=QS@c_Zs-*y-(iLvF<`G_$p`Au4qbT znras&8ya@3N!B&ir)rzhTQl{^+Dvjwx~X$CKLRrLN6NZO1DcD5<&1>il$ObA<%vDwpfLz})7rD%q4;-^kC7Ja4Ox@;OW_C-9$QOg5oT(z{P+S+cpA z=Go~5YVzqs%QJ+|M7>I!+aoKWM|u7jYU>umv{wXAvE6KL%aVOxnSBa^o8f&6x*ETt zh=2aEqZ&Bxt@2o{OyykU(R-Z`3kmH7Dc(mevMfCslI)lE>?^M2Sv5cwR9F)7PS*Fl z5BEPD7q4oCcoi1qRSogHlXgu0l6X~f#H+99jd&Fn7K|-cMvu7Ms`Ywzb`TVH>uL27 z)YPRK2^bV~D^|ScA@Ta~UO{Q`ie)<(x;F(D6Q;loW+nUNWb~C@=idtbXF(@c_@v{GZ z;jwFfvf$~FJ>yS3^7v}WtO=?J3xWa+syyq63o`}X4HgFPgUcaXhL|Z2uO_@&4>;n4 zst+hBJPRxV`-1(!b3yJvggt2mMQE}pm!^!@>1Js{N&IXx$!$YD46ek;FB z-8O1Qt2$9-{mK?>u3N9LD8H{?QNQKM?ah)K%|}P;+^kQlbJ#sv=hROY6bA7=;2;!c z>#c2jhonH<1PkVu=!Md+31U1~*`)s&CzCFblnzkn(~MJ*qiL>n^|H4~&Hm6e7V562 zN%Qj0o~AFS?_-uoA-M4-0sD+s;Zh!rmt8xUI<|rQeL#l9>%&#|?#2HQ{v+_$9aY5} z6eLU^hPOdU-eLT^74L)pT>|1TUXP#W7e@KFJN`G}KS;oT^1dd*k9RBnEvfC)pM;sX zMCGI#)+)OuOvP;zCiR*y^+9dI=K3%-x@cHqa$8oW`k*#pS()l%+JqUIvU`+PcDxS7 zMk70RZfs*Ld^Q#yiR~O2+qpQlb6afZk7Bz<#_Qt!Ft*b0wqC9R;(ANb&f!(~XS^FP z>huznE}Je#QAZ&0`fzVkyt6i~M~?gzKkA=x{<2Zjf4%cZC$0R~@UFZr?YJI-QsTxI z#%_v*cgMoNi|^bJ-}zL0S5bV|>iDkj#&78^x$nbM4avp$=leulYGh6UmA3p<#;Lrk(o6$2 zN0|;%?%)!T{LqI6Az{jUsB|v{HMf}s-U`kJ?+53Cd%;TZF|Z2!M{qv)5?Bo$02hL9 zgNs1vqz3#gsC<3sP;(IFPj!4T{(V4|NB8Q5LtS_&cqQ*+z$Kt;QKDLblkNw}!nk65 z2U3E8SgwUu^6Y78#9us9pi8o-_%nmcf??7IPO>k-XQ;Gh-V<5-6vTbI#Kz=HZVcq- z{L9FvyjOs|K<2|?fADJXeDE4@BzPUD`a(Y(5+|qyH-euBH6Tkr+rb-nSO2{V{35s- z+y&Nww}ax_1FqryF0dZ_D{w7%FPH@X1{B}J;5y#F3DO^g-v&2;`@j_VBq%=FmAr({ zf}6nagAL#d;AZd@P<*d})RpkZU>bZK+ycG<-UuE9#rH0l;r-WO6Zl(@GKL?3TS2ON za1+=I+y>e{X&xpY=P}_!R}Y=9`Y(Qd1X{_a2aJEjJpX z&dWZ5>?WJ+h4w=SphHj(n9uhSc+b02M*{_9WvW~M$$oOa57+Ym#_Nn<|E*6puc}I} ztJ~T@HSX9vv>$T(Jd|ldt9ioDBn&sug85|}Ec{cSZdrYOb2`KLaT04hWcNXW((~i6 z`Wst@_QxlUzp9=?OdGW0uN~t?oA#vsycDweiDmPtID;WM^hEpp%j}v@dku2rBbW^1 z5@-Wt5;7sD#*ggp=W9N1>eszH3q5|7zF%bx%8VJzd`(EPKfBYlmTUK{dGOJ&$ffkX61CZi*Uip6ozt^BE@E_)6Xx%AUg^{&UW8G$^ zJ+{0m^B-=rShbfk(bbuIT$#oxz_}ul-|Wj&m1^RE(4>D-=_13_4=2ly4StVemP@xs zcgwKJrLVWXqkKWCYvxW7+h*Jc5GriLW}qDlJsH%mmFECjr{I@nAD}F?cIj z2Hpm09e6uf4%+-ms-NFhpf7TSv+JB`jJqSD3TUc9`D>i^`q~4p?L%Tt`}S;Nw~=Dk zSkf1%gw!FkHcNn0c~`kq9`b0`jO5X*6{mnR2%ign4y**Rr_1kH(yxGq(#MXWxH zutE_#30@Z}v+YA-*?x#V-ptW~U;#3u3+$C$H%lj1@P0P92*f^S9gCk?uU-Q()P>iA zOF)~4=pI2mWuF0!Z&m*7@Y{YOraEET3vDE;3(_-rp)Q8B5o3n|pxTS(gyO>!Q3{5ZL}A7N{Rl+OlUU{&H$J(#3^fA20!G1vLy*dXT9X z*d%2CKy5Lc4N~uSEe0u*vCnw0nRnImFM-sd@arIYG;2=P^Cx+)0Dk~dw|4#*qz#!p z0@_emLPkgse4OW6%z?I;Q;2JOkZUnKNt4|B4Lvx@?hu4F{ zp&8H$s0O+OQoFkr(z%cN0fm1Hx*|gIuY%N9s9%@~NrreQK#xL_=Sge*`H!e>EB zL;Tu*J6ZY4n@Hs-hbB6l462RjoJuqd`W&RPDxFcL-F!g3q&=E*Tfm&j3TH#wt9ulB z9(ohf9?)RyT@EdW8lVu;KK=KgS0L4k0NeOB$6MZ=0ve#&Q+w_DgLY+{#tHAJ1BFBJ zz{D`x^_%r?SIKj%VCUtc)Nr=xuaeO*MoK4gG|FAi-biq6|rgjk@5DPF!UE62hKk@07s%_zVSTMiL+X^@Obh)FmDw1wT=Ef?spBpp&1hy{3 z=p(F?eaqeRFq%EOHshu8GQ#wyLrs6;$Ku`iTf4EXB{94`?pROaOkJS1>B$?A-AQ=8L1vb1|d0!rv!M<*~MDe_u%B ztMa1pRe7A9mEE#0BpFuEv8?{1I+^QaRD#k?RaS=PZhf=+MSGnM6Y$JLz!GQ!bUXAQ zv>(#iQ0Jk!bo$nJNY4p})h54A9_~W8%Dj_jp~hQ-&i@JL|2yaZdjb{yeTP>$|6z{* zQultJ3$Jtjx+{ZMaEA+LE@a+!I=(3m|IP7z+r1xle7|)5S2=&3o$y~U(#cCX-0b+6 z)0ps-$;|UV00cbaW#3Y4R2BT+5U9IY~@7zS-?aXkFa!7>TXJTLmXty`A7? zwhv4A2ZN!06H$ftGgZa}cJ!wY5e7r0korgU6V(uN=U_FYaZG*Q9_VY(Ug&XXKlCzm z0D2ob1Ra5NhB5$3Ksq0t4pl+gSJwSK?JYM$A*3@?&Cwo&_CZfW{|vnbwRIN+ea+Z- zHvK#+&MRxit(w=^oY}EzNjlZYgt#OaX~JcyZteoupkPeIuY78`9Fz1YZ_Hg5it@$+ z$6KMX+{#scV?oR17SC_}9sk4@{tpa)%f%GWZ~YxVgMgQ>y-s!m%)N4z-Sb<2$3M9x z@4AOz^25ah&ujf0FCEp8h)%i(tq(QrcuF$L{yh? zH}Q(fj(c4)==uEYMmO;wvPm3~Z^K*}rfbb>^$$zlbzu!8XdkMp?KwX;&|I#EX-9Sp zZIAa1^;6N$X!ow^Gmbs*@qLXAcl`zv_TjGI&>BA;v~y5{wtQU664b z<7n(J2wE=yeHh@SrMa}u&>_l&Vj-1)F7sU18Ad@q4D@@ zPtQBfzjR*__nZ9&_&IviK1r6I{JZt-7hKcbJ{_cuDV?Z0_JhJQJ6Y2u?#Xj2%ID9o z@>SEzZ9kooppQ$Zl!bOA%O<&Y(lHaIU~2jN$~hGkRW4H}PJ>ypD}dVQNtDHX2p3e$ znOI&vZQdM{%8AqHAB=XH*PQ<3(r_PrmH9rUDVQ^D+Qey7r_6K3%G#uT-4zFKI>r#} zSene;&4*^ex{MZIAJ<3z2i7xIYKfJ|0=lI;E#OR0Ew)G%QYwEi#3QQCDpXxm#(t!gxPncP&-XYBxr45jbENzJ zBh&8Z>YbY=ixvCjdQ^!F1)P@HG4VkTWaI`?Kjo)$B8>=gngYH7Y5dV9rOsR`soZ_Q zU66Q(Lz4FZ{yJNd``J~KOw+e-UFY{4ikg7>Fo?4)7)(Q9Lb(?hptZL=n&;Z%(00Nb zP^$Kxn^E%P$kDfXv$0Jd;%jc8d7k#bWh2dP#zPlFI=_>Bm{psT3fZd!(!4_Uk*#D$ z*-mznt@}d*Ak87P7E%5+m(-d>^Plse^C8_zx&XQmNn|CImxZ>MJ^%9Z`|fB&s(+du#J-%d~a`&?_UMb4vr%m1F~8p!|s zC;K;^v=)#qy4v4=(q2#g{vYc{)~hUGgZ%x!W6#c_ePI6nUsM~%f7YIb_9e8}puLZo zP&Kq1S`9To+o3(s*Py-72-<1pE~DCrJs5)qZ1PH7uNFkKWHYp|1o~nW3Q;M`~2cj2QJ+E z^ui~~UcU2xzVVBh`THNO{@)kv{4Xim@v?VIqE{C>=eC4ziJc=ofB!>cNEdLrKcPF5 zopt|1_X}o2b0FRSm;v$kOZ2x(^j-Ba_docYO@EKa%r~?y(S07>|K<}q{k@c&-2a%4 m9Nl@