C# обрезка растровых изображений в зависимости от местоположения растрового изображения - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть файл PDF, содержащий многочисленные страницы рукописных опросов. Мое приложение C# в настоящее время разбивает каждую страницу PDF на отдельные объекты Bitmap (каждая страница PDF является объектом Bitmap), а затем использует различные API-интерфейсы для чтения рукописных данных из каждого объекта Bitmap и затем вводит извлеченные данные в базу данных.

Моя проблема в том, чтобы мой API-интерфейс работал, каждый флажок и каждый блок ответов должны находиться в точно одном и том же положении пикселя XY в каждом растровом изображении. Поскольку эти файлы PDF являются отсканированными изображениями, каждая страница PDF может быть на несколько пикселей в любом направлении, например, некоторые страницы PDF располагаются на несколько пикселей влево, вправо, сверху или снизу

Кто-нибудь знает, если это можно обрезать растровое изображение на основе некоторой константы в каждом растровом изображении? Например (см. Растровое изображение ниже), если бы я мог обрезать каждое растровое изображение, начиная с «S» в «Обучении в средней школе» в верхнем левом углу каждой страницы, то каждое растровое изображение было бы обрезано в том же месте, и это решило бы мою проблему. проблема каждого флажка и окна ответа, находящихся в тех же XY местах.

Буду признателен за любой совет.

РЕДАКТИРОВАТЬ: единственное возможное решение, которое я могу придумать, - это циклическое прохождение каждого пикселя, начиная с верхнего левого угла, пока он не достигнет черного пикселя (который будет первый «S» в средней школе учится). Могу ли я затем обрезать растровое изображение из этого местоположения?

enter image description here

1 Ответ

0 голосов
/ 09 апреля 2020

Я пришел к решению, которое было похоже на упомянутое выше. Я сканирую каждый пиксель и до тех пор, пока он не достигнет первого пикселя в «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);
...