C# c中Image.Save和FileStream.Write()的区别#

C# c中Image.Save和FileStream.Write()的区别#,c#,.net,c#-4.0,C#,.net,C# 4.0,我必须从数据库中读取图像二进制文件,并将此图像二进制文件保存为文件系统上的Tiff图像。我使用了下面的代码 private static bool SavePatientChartImageFileStream(byte[] ImageBytes, string ImageFilePath, string IMAGE_NAME) { bool success = false; try { using (FileStr

我必须从数据库中读取图像二进制文件,并将此图像二进制文件保存为文件系统上的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提示的图像二进制文件。这将返回具有1字节数据的ImageBytes,并将其保存为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字节或不完整,则不会保存图像,并将成功返回为false

我无法移除NOLOCK,因为我们正在进行极端锁定

第二个代码比第一个代码慢。我试了500张照片。相差5秒


我无法理解这两段代码之间的区别,以及何时使用哪段代码。请帮助我理解。

我认为两者之间的主要区别在于,在第二段代码中,您首先将源字节[]写入MemoryStream对象,这意味着如果数据基本上独立于数据库。因此,您可以将此MemoryStream潜在地合并到第一个代码中以获得相同的结果。

我认为两者之间的主要区别在于,在第二个代码中,您首先将源字节[]写入MemoryStream对象,这意味着如果数据基本上独立于数据库。因此,您可以将此MemoryStream潜在地合并到第一个代码中,以获得相同的结果。

在第一个版本的代码中,您实质上是获取大量字节并将它们写入文件系统。没有验证有效的TIFF文件,因为代码既不知道也不关心它是TIFF文件。它只是一堆字节,没有任何附加的业务逻辑

在第二段代码中,您将获取字节,将它们包装在MemoryStream中,然后将它们输入到图像对象中,图像对象解析整个文件并将其作为TIFF文件读取。这为您提供了所需的验证—它可以告诉您数据何时无效—但实际上您需要对整个文件进行两次检查,一次读取(额外的解析开销)一次写入磁盘


假设您不需要任何需要深入解析图像文件(颜色、图像尺寸等)的验证,只需检查
byte[]ImageBytes
的长度是否为1(或找到任何其他损坏数据的良好指示器),如果不匹配,则跳过写入,即可跳过此开销。实际上,您需要自己进行验证,而不是将Image类用作验证器。

在代码的第一个版本中,您实际上需要获取大量字节并将它们写入文件系统。没有验证有效的TIFF文件,因为代码既不知道也不关心它是TIFF文件。它只是一堆字节,没有任何附加的业务逻辑

在第二段代码中,您将获取字节,将它们包装在MemoryStream中,然后将它们输入到图像对象中,图像对象解析整个文件并将其作为TIFF文件读取。这为您提供了所需的验证—它可以告诉您数据何时无效—但实际上您需要对整个文件进行两次检查,一次读取(额外的解析开销)一次写入磁盘


假设您不需要任何需要深入解析图像文件(颜色、图像尺寸等)的验证,只需检查
byte[]ImageBytes
的长度是否为1(或找到任何其他损坏数据的良好指示器),如果不匹配,则跳过写入,即可跳过此开销。实际上,您可以自己进行验证,而不是将Image类用作验证器。

如果验证速度较慢,Image.FromStream()并不便宜。你不能只检查ImageBytes.Length是否有一个合理的值吗?当然它会慢一些,Image.FromStream()并不便宜。你不能检查ImageBytes.Length是否为合理值吗?