使用C#基于目录中的文件前缀创建分页的tiff文件

时间:2012-07-23 13:43:48

标签: c# file tiff

不需要像我已经拥有的那样创建tiff文件。我只是想弄清楚基于目录中文件名的预修复来创建文件的算法。

我有一个名为C:\Policy Images的文件夹。在这个文件夹中是图片。图片的名称如下:

政策编号/图片名称:

AAAAAAA-Pic1
AAAAAAA-Pic2
AAAAAAA-Pic3
ZZZZZZZ-Pic1
ZZZZZZZ-Pic2
FFFFFFF-Pic1
...

创建tiff文件时,我需要为每个策略编号创建1个tiff。基于以上所述,例如,Id有这个:

 AAAAAAA-1 (containing 3 pages in this tiff file) 
 ZZZZZZZ-1 (containing 2 pages in this tiff file) 
 FFFFFFF-1 (containing 1 page in this tiff file)

我的代码的问题是它正在为目录中的所有文件创建一个tiff而不是基于策略编号。代码中“foreach (string s in AllFilesInDirectory)”的部分需要真正foreach(策略1 /策略2 /策略3中的字符串s等)。

我到底该怎么做?我现在正把头撞在墙上。

这是我到目前为止所做的:

string[] AllFilesInDirectory = Directory.GetFiles(SelectedDirectory);

//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 AllFilesInDirectory)
{
   if (frame == 0)
   {
      pages = (Bitmap)Image.FromFile(s);
      //save the first frame
      pages.Save(AppVars.MergedPolicyImagesFolder + "\\" + PolicyNumber + ".tiff", info, ep);
     PolicyNumber++;
   }
   else
   {
      //save the intermediate frames
      ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);
      Bitmap bm = (Bitmap)Image.FromFile(s);
      pages.SaveAdd(bm, ep);
   }

   if (frame == AllFilesInDirectory.Length - 1)
   {
      //flush and close.
      ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush);
      pages.SaveAdd(ep);
   }
 frame++;
}

1 个答案:

答案 0 :(得分:1)

为了实现目标,首先需要一些分割文件名的方法。在下面的代码中,我依赖于您提供的模式作为示例。如果真实文件名具有不同的模式,则需要调整代码的拆分部分(可能借助正则表达式)。拆分后,您需要按策略分组。在C#中,这是通过扩展方法GroupBy完成的,这要归功于LINQ。这是一个小代码片段,显示了一般的想法:

var data = new [] {
    "AAAAAAA-Pic1",
    "AAAAAAA-Pic2",
    "AAAAAAA-Pic3",
    "ZZZZZZZ-Pic1",
    "ZZZZZZZ-Pic2",
    "FFFFFFF-Pic1"
};

var splittedEntries = data.Select(entry => {
    var parts = entry.Split('-'); // adapt to real pattern of filenames
    return new { Policy = parts[0], Picture = parts[1] };
});

var groups = splittedEntries.GroupBy(entry => entry.Policy);
foreach (var grp in groups) {
    Console.WriteLine("Do somethin for group {0}", grp.Key);
    foreach (var entry in grp) {
        Console.WriteLine("  * {0}", entry.Picture);
    }
}