c# - как объединить изображения по вертикали? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть этот код, но он не работает. Я пытаюсь извлечь изображение с сайта, содержащего капчу.

        var width = Images.First().Image.Width; //all images in list have the same width so i take the first
        var height = 0;
        for (int i = 104; i < 140; i++) //the list has 300 images. I have to get 36 that contains the captcha separated into pieces
        {
            height += Images[i].Image.Height; 
        }
        var bitmap2 = new Bitmap(width, height);
        var g = Graphics.FromImage(bitmap2);

        height = 0;
        for (int i = 104; i < 140; i++)  
        {
            Image image = Images[i].Image;
            g.DrawImage(image, 0, height);
            height += image.Height;
        }

        bitmap2.Save(@"C:\Users\user\Desktop\test\test.png", ImageFormat.Png);

С помощью этого кода я получаю следующий результат:

image

Я не знаю, почему это плохое качество. Я думаю, что это повторение изображений, которые записаны в результате растрового изображения

1 Ответ

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

Я вижу несколько неоптимальных вещей в коде, но, честно говоря, ни одну вещь, которая может дать такой результат. Единственный способ получить такие проблемы - это если вы go возитесь с необработанным бэкэндом и выполняете операции, которые портят то, как данные интерпретируются как образ.

Только две указанные c вещи, которые Нужно исправить в коде вроде:

  • Установка разрешения всех изображений на одинаковые значения. Это влияет на то, насколько большими они нарисованы, и, таким образом, может испортить расположение
  • Закрытие объекта Graphics после того, как вы закончите с ним, поэтому все изменения будут подтверждены до того, как вы попытаетесь что-либо сохранить.

Обратите внимание, что в моем скорректированном коде images - это просто List<Bitmap>, а for-l oop просто перебирает их всех. Вы никогда не указывали тип вашей коллекции Images, и мне было гораздо проще ее проверить.

Int32 width = Images.First().Width;
Int32 height = 0;
for (Int32 i = 0; i < Images.Count; i++)
{
    height += Images[i].Height;
}
Bitmap bitmap2 = new Bitmap(width, height);
bitmap2.SetResolution(72, 72); // <-- Set explicit resolution on bitmap2
// Always put Graphics objects in a 'using' block.
using (Graphics g = Graphics.FromImage(bitmap2))
{
    height = 0;
    for (Int32 i = 0; i < Images.Count; i++)
    {
        Bitmap image = Images[i];
        image.SetResolution(72, 72); // <-- Set resolution equal to bitmap2
        g.DrawImage(image, 0, height);
        height += image.Height;
    }
}
bitmap2.Save(@"C:\Users\user\Desktop\test\test.png", ImageFormat.Png);
...