【问题标题】:difference between Image.Save and FileStream.Write() in c#c# 中 Image.Save 和 FileStream.Write() 的区别
【发布时间】:2012-02-07 12:03:19
【问题描述】:

我必须从数据库中读取图像二进制文件并将此图像二进制文件保存为文件系统上的 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 秒。

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

【问题讨论】:

  • 当然比较慢,Image.FromStream() 不便宜。您不能只检查 ImageBytes.Length 的合理值吗?

标签: c# .net c#-4.0


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 2011-05-11
      • 2011-10-22
      • 2021-11-07
      • 2021-12-10
      • 2010-09-18
      • 2011-05-28
      • 2018-09-12
      • 2010-12-27
      相关资源
      最近更新 更多