【问题标题】:How to store tiff images in memory in wpf?如何将tiff图像存储在wpf的内存中?
【发布时间】:2015-08-19 14:14:29
【问题描述】:

我想将 tiff 图像作为字节存储在列表中(超过 100 帧)。我正在使用 TiffBitmapDecoder 解码 tiff 文件并将每个帧转换和存储为列表中的字节。它在两者之间抛出 System.OutOfMemoryException,我无法处理! 有没有办法将大图像存储在内存中?谢谢。

ms = New MemoryStream(File.ReadAllBytes(FilePathName)) tiffbmpdecoderViewerImage = New TiffBitmapDecoder(ms, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default) For Each frame As BitmapFrame In tiffbmpdecoderViewerImage.Frames ms = New MemoryStream BmpEncoder = New BmpBitmapEncoder BmpEncoder.Frames.Add(frame) BmpEncoder.Save(ms) ByteArrayList.Add(ms.ToArray) //exception Next

【问题讨论】:

  • “超过 100 帧”应该是什么意思? AFAIK,TIFF 文件没有动画......没有“框架”。
  • 除了不可能在内存中保存任意大量的位图之外,BMP 肯定不是最紧凑的格式,使用 JPEG 等压缩格式可以节省 10 倍或更多。跨度>
  • 一个 Tiff 图像可以包含多页。请参考awaresystems.be/imaging/tiff/faq.html

标签: wpf vb.net


【解决方案1】:
  • 简短回答:“不”
  • 长答案:不,你不能超过你的物理内存但是如果你正在为 x86 编译(非常怀旧?)你可以将你的可用 RAM 扩展到 4 GiB:*click。我建议将你的平台切换到 x64 .... 现在是时候了,你迟到了 10 年,伙计
  • 您还可以对文件进行分段并单独处理每个文件...实际上没有必要同时将所有大图像放在内存中
  • 这是一篇关于 x64 迁移的微软文章:*click

【讨论】:

  • 感谢@specializt,我试过 x64 并且效果很好。但是对于具有 150 多帧的 tiff 图像,它需要 5GB 的 RAM。如果您在第三点添加更多 cmets 将会很有帮助。
  • 显然您也可以完全禁用缓存:msdn.microsoft.com/de-de/library/…,您正在寻找BitmapCacheOption.None - 当然这会大大增加加载/处理时间。如果您想在不使用内存的情况下处理 5 GB 的图像数据,那么您正在查看 HOURS 的运行时间......我认为您的数据源有缺陷,这个星球上没有一个人足够密集来创建价值 GIGABYTES 的图像数据也许除了天文研究人员
  • 物理内存在采用虚拟内存管理的系统中是不相关的(参见Memory Management 的介绍)。 x86 服务器版本的 Windows support up to 64GB RAM。但同样,可用 RAM 对进程可以使用的可用虚拟地址空间没有影响。
  • A System.OutOfMemoryException 在进程用完虚拟地址空间时引发。本文的文档链接:“Out Of Memory” Does Not Refer to Physical Memory.
猜你喜欢
  • 2015-11-02
  • 2011-08-11
  • 2015-06-15
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2022-12-22
相关资源
最近更新 更多