1

我正在开发一个将许多图像作为字节 [] 存储在数据库中的系统。每个 byte[] 已经是一个多页 tiff,但我需要检索图像,将它们全部转换为一个多页 tiff。系统以前使用 System.Drawing.Image 类,带有 Save 和 SaveAdd - 这很好,因为它逐步保存文件,因此内存使用量最小,但是遇到了 GDI+ 并发问题 - 这是在后端运行的在 COM+ 中。

这些方法被转换为使用 System.Windows.Media.Imaging 类、TiffBitmapDecoder 和 TiffBitmapEncoder,在两者之间进行了一些按摩。这解决了并发问题,但我正在努力寻找一种方法来逐步保存图像(即逐帧)以限制内存使用,因此可以操作的图像大小要低得多(即我创建了一个测试 1.2 GB 图像使用 GDI+ 类,并且可以继续,但使用其他方法只能创建一个 ~600MB 文件)。

有没有办法逐步保存多页 tiff 图像以避免内存问题?如果多次在 TiffBitmapEncoder 上调用 Save,则会引发错误。

4

2 回答 2

1

我已经通过 LibTIFF.NET 完成了这项工作,我可以通过这种方式轻松处理数 GB 的图像。请参阅我的问题

使用 c# 中的 LibTIFF 访问平铺的 tiff 图像

虽然我将它用于平铺访问,但内存问题是相似的。LibTIFF 允许完全访问所有 TIFF 函数,因此可以以类似目录的方式读取和存储文件。

另一件值得注意的事是 GDI 在不同 Windows 版本上的差异。请参阅GDI .NET 异常

于 2010-02-04T14:02:26.410 回答
1

我想我会使用标准的 .NET 方式来解码 tiff 图像并编写自己的 tiff 编码器,该编码器可以逐步写入磁盘。tiff 格式规范是公开的。

解码 tiff 并不容易,这就是为什么我会为此使用 TiffBitmapDecoder。编码更容易,所以我认为编写一个编码器是可行的,你可以用单独的帧来馈送它,并将必要的数据逐步写入磁盘。一旦准备好更新 IFD(图像文件目录)条目,您可能必须更新生成的 tiff 的标题。

祝你好运!

于 2009-12-04T15:22:54.320 回答