本帖最后由 getstr88 于 2022-6-26 16:33 编辑
作用是把多个tif文件,合并为一个tif,每个原来的图片作为合并后的tif的一个page。因为使用TesseractOCR训练,需要合并tif
jTessBoxEditorFX是网上有人做的一个工具,也有合并tif功能,但不开源,不知道怎么实现的(请不要灌水说句那把它逆向了看看怎么写的不就行了呗)
下面是我用C#代码写的,合成后的图片能正常查看,而且属性上看不出什么差别。
但是,用Beyond Compare 4 进行16进制对比,却有很大不同,也就3张原始图片编码的那很小一部分是相同的
最关键的是,如果文件不完全相同,但都能用也行啊。关键是图片预览真的没有半点不同,但我用代码生成的图片,Tesseract是不认的,会报错。所以,不得不问下精通tif编码的大佬
附件中是3个没合并前的图,为1、2、3 然后2个分别用我的代码和jTessBoxEditorFX工具合并的。
求助区不支持上传rar,所以放到蓝奏云了 https://wwp.lanzouq.com/iKjVf06tfa9a
求对tif编码精通的大佬指点一下。也求不准备研究这个问题的朋友,麻烦别在这个帖子里灌水回复些毫无用处的,你自己都不会做的方案
[C#] 纯文本查看 复制代码 /// <summary>
/// 将多张Image支持的图片格式文件(支持本身就含多个page的tif)合并为一个tif图片,每个单张图片将作为合并后的tif的page
/// </summary>
/// <param name="allPicFilePaths">所有要合并的图片完整路径</param>
/// <param name="mergeTifSavePath">合并后的tif保存路径</param>
public static void MergeTif(IEnumerable<string> allPicFilePaths, string mergeTifSavePath)
{
ImageCodecInfo imageCodecInfo = GetEncoderInfo("image/tiff");
EncoderParameters ep = new EncoderParameters(1);
Bitmap bitmap = null;
Bitmap tempBitmap = null;
int frame = 0;
foreach (string oneFilePath in allPicFilePaths)
{
MemoryStream memoryStream = new MemoryStream(File.ReadAllBytes(oneFilePath));
tempBitmap = (Bitmap)Image.FromStream(memoryStream);
if (frame == 0)
{
bitmap = (Bitmap)tempBitmap.Clone();
// save the first frame
ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
bitmap.Save(mergeTifSavePath, imageCodecInfo, ep);
// save the second frame if any
int imageFrameCount = tempBitmap.GetFrameCount(FrameDimension.Page);
if (imageFrameCount > 1)
{
ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
for (int i = 1; i < imageFrameCount; i++)
{
tempBitmap.SelectActiveFrame(FrameDimension.Page, i);
bitmap.SaveAdd(tempBitmap, ep);
}
}
}
else
{
// save the intermediate frames
ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
int imageFrameCount = tempBitmap.GetFrameCount(FrameDimension.Page);
for (int i = 0; i < imageFrameCount; i++)
{
tempBitmap.SelectActiveFrame(FrameDimension.Page, i);
bitmap.SaveAdd(tempBitmap, ep);
}
}
if (frame == allPicFilePaths.Count() - 1)
{
// flush and close
ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush);
bitmap.SaveAdd(ep);
}
tempBitmap.Dispose();
memoryStream.Dispose();
frame++;
}
bitmap.Dispose();
} |