c#中Image.Save和FileStream.Write()之间的区别
本文关键字:之间 区别 Write FileStream Image Save | 更新日期: 2023-09-27 18:23:42
我必须从数据库中读取图像二进制文件,并将该图像二进制文件保存为文件系统上的Tiff图像。我使用了以下代码
private static bool SavePatientChartImageFileStream(byte[] ImageBytes, string ImageFilePath, string IMAGE_NAME)
{
bool success = false;
try
{
using (FileStream str = new FileStream(Path.Combine(ImageFilePath, IMAGE_NAME), FileMode.Create))
{
str.Write(ImageBytes, 0, Convert.ToInt32(ImageBytes.Length));
success = true;
}
}
catch (Exception ex)
{
success = false;
}
return success;
}
由于这些图像二进制文件是通过合并复制传输的,有时会发生图像二进制文件未完全传输的情况,我们会发送带有nolock提示的获取图像二进制文件的请求。这会在ImageBytes中返回1字节的数据,并将其保存为0 kb损坏的tiff图像。
我已将上述代码更改为:-
private static bool SavePatientChartImage(byte[] ImageBytes, string ImageFilePath, string IMAGE_NAME)
{
bool success = false;
System.Drawing.Image newImage;
try
{
using (MemoryStream stream = new MemoryStream(ImageBytes))
{
using (newImage = System.Drawing.Image.FromStream(stream))
{
newImage.Save(Path.Combine(ImageFilePath, IMAGE_NAME));
success = true;
}
}
}
catch (Exception ex)
{
success = false;
}
return success;
}
在这种情况下,如果ImageBytes为1字节或不完整,它将不会保存图像,并将success返回为false。
我无法删除NOLOCK,因为我们正处于极度锁定状态。
第二个代码比第一个代码慢。我试了500张照片。相差5秒。
我无法理解这两段代码之间的区别以及何时使用哪段代码。请帮我理解。
在代码的第一个版本中,您基本上需要获取一堆字节并将它们写入文件系统。无法验证有效的TIFF文件,因为代码既不知道也不关心它是TIFF文件。它只是一堆没有附加任何业务逻辑的字节。
在第二段代码中,您将获取字节,将它们封装在MemoryStream中,然后将它们输入到Image对象中,该对象将解析整个文件并将其读取为TIFF文件。这为您提供了所需的验证-它可以判断数据何时无效-但您基本上要对整个文件进行两次检查,一次是读取它(还有额外的解析开销),另一次是将它写入磁盘。
假设您不需要任何需要深入解析图像文件(颜色、图像维度等的数量)的验证,您可以通过简单地检查byte[] ImageBytes
的长度是否为1(或找到损坏数据的任何其他良好指标)来跳过这一开销,如果不匹配,则跳过写入。实际上,您可以自己进行验证,而不是使用Image类作为验证器。
我认为两者之间的主要区别在于,在第二段代码中,您首先将源byte[]写入MemoryStream对象,这意味着如果数据基本上独立于数据库。因此,您可以将这个MemoryStream合并到第一个代码中,以获得相同的结果。