getstr88 发表于 2022-6-23 10:51

我用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();
      }

smilencetion 发表于 2022-6-23 11:43

真的没有开源吗


getstr88 发表于 2022-6-23 11:51

本帖最后由 getstr88 于 2022-6-23 11:53 编辑

smilencetion 发表于 2022-6-23 11:43
真的没有开源吗
这只是它的程序啊,只是给你用的呀。没有源码啊兄弟。包括github上好些无聊的人上传的jTessBoxEditorFX的搬运,就是你这里官方的下载地址。 你不会以为Fx是成品,不带fx的那个zip是代码吧??兄弟,带Fx和不带fx,只是它用java不同的UI库做的软件界面

而且退一步讲,就算有源码。他用java写的,我用C#写的,能用的基础库也不一样。还是只能搞懂编码的区别才行

smilencetion 发表于 2022-6-23 14:49

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”
先保证你的代码生成的符合它要求,最后祝你成功解决

getstr88 发表于 2022-6-23 15:09

smilencetion 发表于 2022-6-23 14:49
哦,原来如此,不过那个github上倒是有源码,还有我这截图下也有(不过是1.7的),java和C#已经挺像的了{ ...

兄弟,我上面也已经说了。那几个放到github的,就是把官网的zip解压上传的,根本不是源码

box格式是完全符合要求的(我的box+我的合并tif=失败, 把tif换成用那个工具生成的,box不变还用我原来的,就成功),现在要解决的是合并的tif不同的问题。

getstr88 发表于 2022-6-24 08:54

继续求助下,搜了几个C#的写法,也都是如此啊,没啥其他写法

getstr88 发表于 2022-6-25 07:22

我有个新的发现,因为原图的位深度都是32,所以用我的C#代码和用jTessBoxEditorFX操作后,都是32位深度的
但如果原图是24位深度的,我的操作出来仍旧是32位,而jTessBoxEditorFX还是24位

这是我发现的区别。不知各位大佬对此有没有什么高见?

getstr88 发表于 2022-6-26 16:32

楼上我发现的问题解决了。不能new bitmap,这样默认new出来是32位深度。得clone。1楼代码已改进

但这个问题仍得继续,还是和用jTessBoxEditorFX的不同

lbh3925695 发表于 2022-7-5 09:51

同问,请问楼主问题解决了吗?

getstr88 发表于 2022-7-5 10:00

lbh3925695 发表于 2022-7-5 09:51
同问,请问楼主问题解决了吗?

没有,没人懂编码
页: [1]
查看完整版本: 我用C#写的这个合并tif文件的代码,为什么和jTessBoxEditorFX合并的文件,相差很大