我试图将多个图像(.tiff / .tif)文件合并到一个图像(.tif)中,然后将Zip文件(包含多个合并的tif图像)发送到AWS S3存储桶
每个zip文件的限制都不得超过5GB。
我有一种情况,我将数千个多页tiff图像合并为一个tiff图像。
使用Bitmap
我将每个tiff图像增量添加到其先前图像并保存该图像。
但是,我正在通过将所有字节读取到 MemoryStream
中来做到这一点。那就是我面临内存不足的问题。
当合并的图像达到阈值大小即2GB(aprox)时,将无法将字节读取到流中,然后附加下一个图像。这将引发OutOfMemoryException 。我了解这是由于CPU RAM的限制。
但是有没有更好的方法来解决我的这个问题?
请在下面找到我的代码。
private void MergeTiffFiles(string filePathWithFileName) {
string[] sa;
sa = Directory.GetFiles(filePathWithFileName.Substring(0,filePathWithFileName.LastIndexOf('.')));
DirectoryInfo di = new DirectoryInfo(filePathWithFileName);
long totalTiffs = di.GetFiles("*.tif").Length;
//get the codec for tiff files
ImagecodecInfo info = null;
foreach(ImagecodecInfo ice in ImagecodecInfo.GetImageEncoders())
if (ice.MimeType == "image/tiff")
info = ice;
//use the save encoder
Encoder enc = Encoder.Saveflag;
EncoderParameters ep = new EncoderParameters(1);
ep.Param[0] = new EncoderParameter(enc,(long) EncoderValue.MultiFrame);
Bitmap pages = null;
int frame = 0;
foreach(string s in sa) {
if (Path.GetExtension(s) == ".tif" || Path.GetExtension(s) == ".tiff") {
if (frame == 0) {
**MemoryStream ms = new MemoryStream(File.ReadAllBytes(Path.Combine("somepath\\test_sample_zip",s)));**
pages = (Bitmap) Image.FromStream(ms);
var appDataPath = @ "somepath\\Desktop\\";
var filePath = Path.Combine(appDataPath,Path.GetRandomFileName() + ".tif");
//save the first frame
pages.Save(filePath,info,ep);
//Save the second frame if any
int frameCount1 = pages.GetFrameCount(FrameDimension.Page);
if (frameCount1 > 1) {
for (int i = 1; i < frameCount1; i++) {
ep.Param[0] = new EncoderParameter(enc,(long) EncoderValue.FrameDimensionPage);
pages.SelectactiveFrame(FrameDimension.Page,i);
pages.SaveAdd(pages,ep);
}
}
} else if (frame < totalTiffs - 1) {
//save the intermediate frames
ep.Param[0] = new EncoderParameter(enc,(long) EncoderValue.FrameDimensionPage);
try {
MemoryStream mss = new MemoryStream(File.ReadAllBytes(Path.Combine("somepath\\Desktop\\test_sample_zip",s)));
Bitmap bm = (Bitmap) Image.FromStream(mss);
int frameCount = bm.GetFrameCount(FrameDimension.Page);
for (int i = 0; i < frameCount; i++) {
bm.SelectactiveFrame(FrameDimension.Page,i);
pages.SaveAdd(bm,ep);
}
} catch (Exception e) {
//LogError(e,s);
}
}
if (frame == totalTiffs - 1) {
//flush and close.
ep.Param[0] = new EncoderParameter(enc,(long) EncoderValue.Flush);
pages.SaveAdd(ep);
}
frame++;
}
}
}
只要RAM可用内存没有用完,代码就可以在特定大小下正常工作。
引发异常的行是
** MemoryStream ms = new MemoryStream(File.ReadAllBytes(Path.Combine("somepath\\test_sample_zip",s)));**
可能无需将它们读入MemoryStream
即可合并tiff图像,这将是解决我的问题的最佳方法,但不知道如何实现。
或者是否有任何第三方软件可以合并tiff图像。