0

我有一个包含大量手写调查页的 PDF 文件。我的 C# 应用程序当前将每个 PDF 页面分解为单个 Bitmap 对象(每个 PDF 页面都是一个 Bitmap 对象),然后使用各种 API 从每个 Bitmap 对象中读取手写数据,然后将提取的数据输入数据库。

我的问题是,为了让我的 API 提取起作用,每个复选框和每个答案框都需要位于每个位图中的完全相同的 XY 像素位置。因为这些 PDF 文件是扫描图像,所以每个 PDF 页面在任何方向上都可能有几个像素的偏差,例如某些 PDF 页面在左侧、右侧、顶部或底部的位置有几个像素

有谁知道是否可以根据每个位图中的某个常量来裁剪位图?例如(请参阅下面的位图图像),如果我可以在每页左上角的中学学习中从“S”开始裁剪每个位图,那么每个位图将在完全相同的位置被裁剪,这将解决我的问题每个复选框和答案框位于相同 XY 位置的问题。

任何意见,将不胜感激

编辑:我能想到的唯一可能的解决方案是遍历每个像素,从左上角开始,直到它碰到一个黑色像素(这将是中学学习中的第一个“S”)。然后我可以从这个位置裁剪位图吗?

在此处输入图像描述

4

1 回答 1

0

我想出了一个类似于我上面提到的解决方案。我扫描每个像素,直到它到达中学学习中“S”中的第一个像素。我使用这个像素 XY 位置,然后从该位置开始裁剪一个具有固定高度和宽度的矩形。我过去常常bm.GetPixel().GetBrightness()找出像素何时到达“S”。

            Bitmap bm = new Bitmap(@"C:\IronPDFDoc\2.png", true);

            bool cropFlag = false;
            int cropX = 0;
            int cropY = 0;

            for (int y = 0; y < 155; y++)
            {
                for (int x = 0; x < 115; x++)
                {
                    float pixelBrightness = bm.GetPixel(x, y).GetBrightness();
                    if (pixelBrightness < 0.8 && cropFlag == false)
                    {
                        cropFlag = true;
                        cropX = x;
                        cropY = y;
                    }
                }
            }

            Rectangle crop = new Rectangle(cropX, cropY, 648, 915);
            Bitmap croppedSurvey = new Bitmap(crop.Width, crop.Height);

            using (Graphics g = Graphics.FromImage(croppedSurvey))
            {
                g.DrawImage(bm, new Rectangle(0, 0, croppedSurvey.Width, croppedSurvey.Height),
                                 crop,
                                 GraphicsUnit.Pixel);
            }

            croppedSurvey.Save(@"C:\IronPDFDoc\croppedSurvey.png", ImageFormat.Png);
于 2020-04-09T00:45:15.080 回答