【发布时间】:2019-09-30 09:35:50
【问题描述】:
我正在尝试开发一个桌面应用程序,将多个图像转换为每个文件夹的多页 Tiff。
我尝试了以下代码,但是当文件夹中有大量大小为 1MB 的文件时,它会引发错误。
public bool saveMultipage(Image[] bmp, string location, string type)
{
if (bmp != null)
{
try
{
ImageCodecInfo codecInfo = getCodecForstring(type);
for (int i = 0; i < bmp.Length; i++)
{
if (bmp[i] == null)
break;
bmp[i] = (Image)ConvertToBitonal((Bitmap)bmp[i]);
}
if (bmp.Length == 1)
{
EncoderParameters iparams = new EncoderParameters(1);
Encoder iparam = Encoder.Compression;
EncoderParameter iparamPara = new EncoderParameter(iparam, (long)(EncoderValue.CompressionCCITT4));
iparams.Param[0] = iparamPara;
bmp[0].Save(location, codecInfo, iparams);
}
else if (bmp.Length > 1)
{
Encoder saveEncoder;
Encoder compressionEncoder;
EncoderParameter SaveEncodeParam;
EncoderParameter CompressionEncodeParam;
EncoderParameters EncoderParams = new EncoderParameters(2);
saveEncoder = Encoder.SaveFlag;
compressionEncoder = Encoder.Compression;
// Save the first page (frame).
SaveEncodeParam = new EncoderParameter(saveEncoder, (long)EncoderValue.MultiFrame);
CompressionEncodeParam = new EncoderParameter(compressionEncoder, (long)EncoderValue.CompressionCCITT4);
EncoderParams.Param[0] = CompressionEncodeParam;
EncoderParams.Param[1] = SaveEncodeParam;
File.Delete(location);
bmp[0].Save(location, codecInfo, EncoderParams);
for (int i = 1; i < bmp.Length; i++)
{
if (bmp[i] == null)
break;
SaveEncodeParam = new EncoderParameter(saveEncoder, (long)EncoderValue.FrameDimensionPage);
CompressionEncodeParam = new EncoderParameter(compressionEncoder, (long)EncoderValue.CompressionCCITT4);
EncoderParams.Param[0] = CompressionEncodeParam;
EncoderParams.Param[1] = SaveEncodeParam;
bmp[0].SaveAdd(bmp[i], EncoderParams);
}
SaveEncodeParam = new EncoderParameter(saveEncoder, (long)EncoderValue.Flush);
EncoderParams.Param[0] = SaveEncodeParam;
bmp[0].SaveAdd(EncoderParams);
}
return true;
}
catch (System.Exception ee)
{
throw new Exception(ee.Message + " Error in saving as multipage ");
}
}
else
return false;
}
在这个函数中,我传递了一个包含当前文件夹图像的图像对象数组。
当我准备一个 Image 数组时,应用程序会抛出一个 Out of Memory 异常。
请提供解决方案。
谢谢。
【问题讨论】:
-
50k 显然太多了,做块,比如说 25k,所以 combine-part1,combined-part2 等
-
我已调试代码工具在添加 500 个大小为 1 MB 的文件后抛出异常。
-
究竟是哪一部分引发了内存异常
标签: c# winforms bitmap tiff image-conversion