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

时间:2012-02-07 12:03:20

标签: c# .net c#-4.0

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

我无法移除NOLOCK,因为我们有极端锁定。

与第一个相比,第二个代码更慢。我尝试了500张图片。相差5秒。

我无法理解这两段代码与使用哪些代码之间的区别。请帮我理解。

2 个答案:

答案 0 :(得分:1)

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

在第二个代码中,您将获取字节,将它们包装在MemoryStream中,然后将它们提供给Image对象,该对象解析整个文件并将其作为TIFF文件读取。这为您提供了所需的验证 - 它可以判断数据何时无效 - 但是您实际上是在整个文件上进行两次,一次读取它(带有额外的解析开销)和一次将其写入磁盘。 / p>

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

答案 1 :(得分:0)

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