吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1782|回复: 9
收起左侧

[求助] 我用C#写的这个合并tif文件的代码,为什么和jTessBoxEditorFX合并的文件,相差很大

[复制链接]
getstr88 发表于 2022-6-23 10:51
本帖最后由 getstr88 于 2022-6-26 16:33 编辑

作用是把多个tif文件,合并为一个tif,每个原来的图片作为合并后的tif的一个page。因为使用TesseractOCR训练,需要合并tif
jTessBoxEditorFX是网上有人做的一个工具,也有合并tif功能,但不开源,不知道怎么实现的(请不要灌水说句那把它逆向了看看怎么写的不就行了呗)
下面是我用C#代码写的,合成后的图片能正常查看,而且属性上看不出什么差别。
1111.png
但是,用Beyond Compare 4 进行16进制对比,却有很大不同,也就3张原始图片编码的那很小一部分是相同的
2222.png


最关键的是,如果文件不完全相同,但都能用也行啊。关键是图片预览真的没有半点不同,但我用代码生成的图片,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();
        }

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

smilencetion 发表于 2022-6-23 11:43
真的没有开源吗
2022-06-23_114207.png

 楼主| getstr88 发表于 2022-6-23 11:51
本帖最后由 getstr88 于 2022-6-23 11:53 编辑

这只是它的程序啊,只是给你用的呀。没有源码啊兄弟。包括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#已经挺像的了
但是我怎么觉得你要先研究那个什么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
同问,请问楼主问题解决了吗?

没有,没人懂编码
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表