From 08063ce85e9259e4cb86da7cac1737c898b4fcef Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Sun, 17 Mar 2024 17:22:51 +0100 Subject: [PATCH] ImageExtensions - Add `ReleaseFromFile` to not keep file handle open --- PCK-Studio/Extensions/ImageExtensions.cs | 7 +++++++ PCK-Studio/Forms/Editor/AnimationEditor.cs | 6 +++--- PCK-Studio/Forms/Editor/CustomSkinEditor.cs | 4 +--- PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs | 10 ++++++---- PCK-Studio/MainForm.cs | 11 ++++------- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/PCK-Studio/Extensions/ImageExtensions.cs b/PCK-Studio/Extensions/ImageExtensions.cs index 994b0588..e8ddedc7 100644 --- a/PCK-Studio/Extensions/ImageExtensions.cs +++ b/PCK-Studio/Extensions/ImageExtensions.cs @@ -31,6 +31,13 @@ namespace PckStudio.Extensions { internal static class ImageExtensions { + internal static Image ReleaseFromFile(this Image image) + { + Image img = new Bitmap(image); + image.Dispose(); + return img; + } + internal static Image GetArea(this Image source, Rectangle area) { Image tileImage = new Bitmap(area.Width, area.Height); diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index aae1adf3..58c8006c 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -321,7 +321,7 @@ namespace PckStudio.Forms.Editor } try { - var img = Image.FromFile(textureFile); + var img = Image.FromFile(textureFile).ReleaseFromFile(); JObject mcmeta = JObject.Parse(File.ReadAllText(fileDialog.FileName)); Animation javaAnimation = AnimationHelper.GetAnimationFromJavaAnimation(mcmeta, img); javaAnimation.Category = _animation.Category; @@ -447,7 +447,7 @@ namespace PckStudio.Forms.Editor if (fileDialog.ShowDialog(this) != DialogResult.OK) return; - var gif = Image.FromFile(fileDialog.FileName); + var gif = Image.FromFile(fileDialog.FileName).ReleaseFromFile(); if (!gif.RawFormat.Equals(ImageFormat.Gif)) { MessageBox.Show("Selected file is not a gif", "Invalid file", MessageBoxButtons.OK, MessageBoxIcon.Error); @@ -477,7 +477,7 @@ namespace PckStudio.Forms.Editor }; if (ofd.ShowDialog() != DialogResult.OK) return; - Image img = Image.FromFile(ofd.FileName); + Image img = Image.FromFile(ofd.FileName).ReleaseFromFile(); var textures = img.Split(ImageLayoutDirection.Vertical); _animation = new Animation(textures, string.Empty); LoadAnimationTreeView(); diff --git a/PCK-Studio/Forms/Editor/CustomSkinEditor.cs b/PCK-Studio/Forms/Editor/CustomSkinEditor.cs index 58caf45b..bee926cd 100644 --- a/PCK-Studio/Forms/Editor/CustomSkinEditor.cs +++ b/PCK-Studio/Forms/Editor/CustomSkinEditor.cs @@ -140,9 +140,7 @@ namespace PckStudio.Forms.Editor if (openFileDialog.ShowDialog() == DialogResult.OK) { generateTextureCheckBox.Checked = false; - // use stream to not leave handle open - using (var imgFs = File.OpenRead(openFileDialog.FileName)) - renderer3D1.Texture = Image.FromStream(imgFs); + renderer3D1.Texture = Image.FromFile(openFileDialog.FileName).ReleaseFromFile(); } } diff --git a/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs b/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs index 625891a0..3394a9b3 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs @@ -120,7 +120,7 @@ namespace PckStudio.Popups OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { - SetNewTexture(Image.FromFile(ofd.FileName)); + SetNewTexture(Image.FromFile(ofd.FileName).ReleaseFromFile()); } } @@ -154,7 +154,9 @@ namespace PckStudio.Popups textSkinName.Text = Path.GetFileNameWithoutExtension(ofd.FileName); return; } - SetNewTexture(Image.FromFile(ofd.FileName)); + + var img = Image.FromFile(ofd.FileName).ReleaseFromFile(); + SetNewTexture(img); } } } @@ -179,13 +181,13 @@ namespace PckStudio.Popups ofd.Title = "Select a PNG File"; if (ofd.ShowDialog() == DialogResult.OK) { - var img = Image.FromFile(ofd.FileName); + var img = Image.FromFile(ofd.FileName).ReleaseFromFile(); if (img.RawFormat != ImageFormat.Png && img.Width != img.Height * 2) { MessageBox.Show("Not a Valid Cape File"); return; } - newSkin.CapeTexture = capePictureBox.Image = Image.FromFile(ofd.FileName); + newSkin.CapeTexture = capePictureBox.Image = img; contextMenuCape.Items[0].Text = "Replace"; capeLabel.Visible = false; contextMenuCape.Visible = true; diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index f4e1d8f6..7b21807d 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -1961,7 +1961,7 @@ namespace PckStudio PckFileData MipMappedFile = new PckFileData(mippedPath, PckFileType.TextureFile); - Image originalTexture = Image.FromStream(new MemoryStream(file.Data)); + Image originalTexture = file.GetTexture(); int NewWidth = Math.Max(originalTexture.Width / (int)Math.Pow(2, i - 1), 1); int NewHeight = Math.Max(originalTexture.Height / (int)Math.Pow(2, i - 1), 1); @@ -2011,12 +2011,9 @@ namespace PckStudio saveFileDialog.DefaultExt = ".3dst"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { - using (var ms = new MemoryStream(file.Data)) - { - Image img = Image.FromStream(ms); - var writer = new _3DSTextureWriter(img); - writer.WriteToFile(saveFileDialog.FileName); - } + Image img = file.GetTexture(); + var writer = new _3DSTextureWriter(img); + writer.WriteToFile(saveFileDialog.FileName); } } }