【问题标题】:Convert Single Page Tiff to Multiple Page Tiff Folder Wise C# (50000 Tiff Files)将单页 Tiff 转换为多页 Tiff 文件夹明智 C#(50000 个 Tiff 文件)
【发布时间】: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


【解决方案1】:

@Hiren Patel,

您可以尝试以下代码,将多页 tiff 拆分为单独文件夹中的各个页面。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace ConsoleApp3
{
   class Program
   {
      static void Main(string[] args)
      {
         string fileName = @"D:\TiffContainer\MultipageTiffImage.tif";

         using (Image imageFile = Image.FromFile(fileName))
         {
            FrameDimension frameDimensions = new FrameDimension(
                imageFile.FrameDimensionsList[0]);

            Bitmap bmp = new Bitmap(imageFile);
            int frameNum = imageFile.GetFrameCount(frameDimensions);
            string[] paths = new string[frameNum];

            for (int frame = 0; frame < frameNum; frame++)
            {
               // Selects one frame at a time and save as jpeg. 
               imageFile.SelectActiveFrame(frameDimensions, frame);

               paths[frame] = String.Format("{0}\\{1}{2}.tif",
                            Path.GetDirectoryName(fileName),
                            Path.GetFileNameWithoutExtension(fileName),
                            frame);
               bmp.Save(paths[frame], ImageFormat.Tiff);
            }
         }
      }
   }
}

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多