ImageExtensions - Add ReleaseFromFile to not keep file handle open

This commit is contained in:
miku-666
2024-03-17 17:22:51 +01:00
parent 839771190d
commit 08063ce85e
5 changed files with 21 additions and 17 deletions

View File

@@ -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);

View File

@@ -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();

View File

@@ -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();
}
}

View File

@@ -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;

View File

@@ -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);
}
}
}