我用C#写的这个合并tif文件的代码,为什么和jTessBoxEditorFX合并的文件,相差很大
本帖最后由 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编码精通的大佬指点一下。也求不准备研究这个问题的朋友,麻烦别在这个帖子里灌水回复些毫无用处的,你自己都不会做的方案
/// <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 = 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 = 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 = 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 = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush);
bitmap.SaveAdd(ep);
}
tempBitmap.Dispose();
memoryStream.Dispose();
frame++;
}
bitmap.Dispose();
} 真的没有开源吗
本帖最后由 getstr88 于 2022-6-23 11:53 编辑
smilencetion 发表于 2022-6-23 11:43
真的没有开源吗
这只是它的程序啊,只是给你用的呀。没有源码啊兄弟。包括github上好些无聊的人上传的jTessBoxEditorFX的搬运,就是你这里官方的下载地址。 你不会以为Fx是成品,不带fx的那个zip是代码吧??兄弟,带Fx和不带fx,只是它用java不同的UI库做的软件界面
而且退一步讲,就算有源码。他用java写的,我用C#写的,能用的基础库也不一样。还是只能搞懂编码的区别才行 getstr88 发表于 2022-6-23 11:51
这只是它的程序啊,只是给你用的呀。没有源码啊兄弟。包括github上好些无聊的人上传的jTessBoxEditorFX的 ...
哦,原来如此,不过那个github上倒是有源码,还有我这截图下也有(不过是1.7的),java和C#已经挺像的了{:1_918:}
但是我怎么觉得你要先研究那个什么Tesseract,它好像有格式要求的的
“providing editing of box data of both Tesseract 2.0x and 3.0x formats”
先保证你的代码生成的符合它要求,最后祝你成功解决 smilencetion 发表于 2022-6-23 14:49
哦,原来如此,不过那个github上倒是有源码,还有我这截图下也有(不过是1.7的),java和C#已经挺像的了{ ...
兄弟,我上面也已经说了。那几个放到github的,就是把官网的zip解压上传的,根本不是源码
box格式是完全符合要求的(我的box+我的合并tif=失败, 把tif换成用那个工具生成的,box不变还用我原来的,就成功),现在要解决的是合并的tif不同的问题。 继续求助下,搜了几个C#的写法,也都是如此啊,没啥其他写法 我有个新的发现,因为原图的位深度都是32,所以用我的C#代码和用jTessBoxEditorFX操作后,都是32位深度的
但如果原图是24位深度的,我的操作出来仍旧是32位,而jTessBoxEditorFX还是24位
这是我发现的区别。不知各位大佬对此有没有什么高见? 楼上我发现的问题解决了。不能new bitmap,这样默认new出来是32位深度。得clone。1楼代码已改进
但这个问题仍得继续,还是和用jTessBoxEditorFX的不同 同问,请问楼主问题解决了吗? lbh3925695 发表于 2022-7-5 09:51
同问,请问楼主问题解决了吗?
没有,没人懂编码
页:
[1]