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秒。

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

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

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

在第二段代码中,您将获取字节,将它们封装在MemoryStream中,然后将它们输入到Image对象中,该对象将解析整个文件并将其读取为TIFF文件。这为您提供了所需的验证-它可以判断数据何时无效-但您基本上要对整个文件进行两次检查,一次是读取它(还有额外的解析开销),另一次是将它写入磁盘。

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

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