2012-02-07 70 views
1

我必须从数据库读取图像二进制文件,并将此图像二进制文件保存为文件系统上的Tiff图像。我用下面的代码Image.Save和FileStream.Write()在c#中的区别

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个字节或不完整的,也不会保存图像和将返回成功为假。

我无法删除NOLOCK,因为我们正在进行极度锁定。

第二个代码比第一个代码慢。我尝试了500张图片。有5秒的差异。

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

+0

确定它比较慢,Image.FromStream()并不便宜。你不能只检查ImageBytes.Length的合理值吗? – 2012-02-07 12:33:15

回答

1

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

在第二个代码中,您将字节包装到MemoryStream中,然后将它们馈送到Image对象中,该对象解析整个文件并将其作为TIFF文件读取。这给你需要的验证 - 它可以告诉数据什么时候无效 - 但是你基本上遍历整个文件两次,一次读入(有额外的解析开销),一次写入磁盘。

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

0

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