gpt4 book ai didi

c# - 关于序列化、反序列化和保存图像的代码的反馈

转载 作者:太空宇宙 更新时间:2023-11-03 22:26:38 25 4
gpt4 key购买 nike

这是我用于序列化、反序列化和将图像保存到文件系统的代码。我看过很多序列化/反序列化的例子,我只是想得到一些反馈,因为我确信我的代码可以改进。任何反馈将不胜感激。我知道这是一个常见问题,所以希望这个问题将来能成为其他人的好资源。

这是使用建议修改后的代码:

    private void Form1_Load(object sender, EventArgs e)
{
RunTest();
}

private void RunTest()
{
byte[] jpgba = ConvertFileToByteArray("D:\\Images\\Image01.jpg");
using (Image jpgimg = ConvertByteArrayToImage(jpgba))
{
SaveImageToFileSystem(jpgimg, "D:\\Images\\Image01_Copy.jpg");
}

byte[] pngba = ConvertFileToByteArray("D:\\Images\\Image02.png");
using (Image pngimg = ConvertByteArrayToImage(pngba))
{
SaveImageToFileSystem(pngimg, "D:\\Images\\Image02_Copy.png");
}

byte[] gifba = ConvertFileToByteArray("D:\\Images\\Image03.gif");
using (Image gifimg = ConvertByteArrayToImage(gifba))
{
SaveImageToFileSystem(gifimg, "D:\\Images\\Image03_Copy.gif");
}

MessageBox.Show("Test Complete");
this.Close();
}

private static byte[] ConvertFileToByteArray(String FilePath)
{
return File.ReadAllBytes(FilePath);
}

private static Image ConvertByteArrayToImage(byte[] ImageByteArray)
{
using (MemoryStream ms = new MemoryStream(ImageByteArray))
{
return Image.FromStream(ms);
}
}

private static void SaveImageToFileSystem(Image ImageObject, string FilePath)
{
// ImageObject.Save(FilePath, ImageObject.RawFormat);
// This method only works with .png files.

// This method works with .jpg, .png and .gif
// Need to copy image before saving.
using (Image img = new Bitmap(ImageObject.Width, ImageObject.Height))
{
using (Graphics tg = Graphics.FromImage(img))
{
tg.DrawImage(ImageObject, 0, 0);
}
img.Save(FilePath, img.RawFormat);
}
return;
}

最佳答案

我从快速浏览中看到的内容:

Streams 应该用 using(...) 模式包装,在您的情况下,如果在处理过程中发生异常,则不会调用 Dispose()。

using (FileStream fs = new FileStream(FilePath, FileMode.Open))
{
// Another small optimization, removed unnecessary variable
byte[] iba = new byte[(int)fs.Length];
fs.Read(iba, 0, iba.Length);
}

您应该只捕获您期望的异常。例如,在 SerializeImage 中,这将是 IOException。捕获所有异常是非常糟糕的做法。

}
catch (IOException ex)
{

Image.FromStream 方法依赖于流,所以如果您关闭底层流并返回图像,您可能会收到不可预测的行为(好吧,在大多数情况下这会起作用,但有时会发生错误)。因此,您需要创建图像副本并将其返回。

using (MemoryStream ms = new MemoryStream(ImageByteArray))
{
using (Image img = Image.FromStream(ms))
{
return new Bitmap(img);
}
}

你不是在SaveImage方法中配置了tg图形对象和img对象(而是配置了ImageObject,见下一段)。一般来说,我认为这种逻辑没有必要,如果您想保存图像并保持质量,只需调用 ImageObject.Save(..., ImageFormat.Png) 即可。

在同一方法 (SaveImage) 中,您设置了 ImageObject 参数。在大多数情况下,这也是不好的做法,请考虑使用 using(...) 模式将此图像放置在 worker 方法之外。

关于c# - 关于序列化、反序列化和保存图像的代码的反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1156608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com