我正在开发一个系统,它将许多图像作为byte []存储在数据库中。每个字节[]已经是多页tiff,但我需要检索图像,将它们全部转换为一个多页面tiff。系统以前使用System.Drawing.Image类,使用Save和SaveAdd - 这很好,因为它逐步保存文件,因此内存使用率很小,但是遇到了GDI +并发问题 - 这是在后端运行在COM +中。
这些方法被转换为使用System.Windows.Media.Imaging类,TiffBitmapDecoder和TiffBitmapEncoder,并在它们之间进行一些按摩。这解决了并发问题,但我很难找到一种方法来逐步(即逐帧)保存图像以限制内存使用,因此可以操作的图像的大小要低得多(即我创建了一个测试1.2使用GDI +类的GB图像,可能已经继续使用,但只能使用其他方法创建~600MB文件。)
有没有办法逐步保存多页tiff图像以避免内存问题?如果在TiffBitmapEncoder上多次调用Save,则会抛出错误。
答案 0 :(得分:1)
我想我会使用标准的.NET方式来解码tiff图像并编写我自己的tiff编码器,它可以逐步写入磁盘。 tiff格式规范是公开的。
解码tiff并不容易,这就是我为此使用TiffBitmapDecoder的原因。编码更容易,因此我认为编写一个可以使用单独的帧进行编码的编码器是可行的,并且可以将必要的数据逐步写入磁盘。一旦准备好更新IFD(图像文件目录)条目,您可能必须更新生成的tiff的标题。
祝你好运!答案 1 :(得分:1)
我是通过LibTIFF.NET完成的,我可以用这种方式处理数GB的图像,没有痛苦。
见我的问题Using LibTIFF from c# to access tiled tiff images
虽然我将它用于平铺访问,但内存问题与此类似。 LibTIFF允许完全访问所有TIFF函数,因此可以以类似目录的方式读取和存储文件。
值得注意的另一件事是不同Windows版本上的GDI之间的差异。请参阅GDI .NET exceptions。