不需要像我已经拥有的那样创建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++;
}
答案 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);
}
}