При работе с Bitmap возникает ошибка: "Недопустимый параметр"

Рейтинг: 0Ответов: 1Опубликовано: 18.08.2023

Есть метод CreateMergePhoto(), который склеивает две фотографии размером 1920х1080px и добавляет на них временную метку. Во время цикла на 235 фотографии, постоянно возникает ошибка:

  System.ArgumentException
  HResult=0x80070057
  Сообщение = Недопустимый параметр.
  Источник = System.Drawing
  Трассировка стека:
   at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
   at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
   at TestMergeCSharp.Program.CreateMergePhoto() in D:\...\Program.cs:line 55
   at TestMergeCSharp.Program.Main(String[] args) in D:\...\Program.cs:line 34

Первая строка ссылается на:

System.Drawing.Bitmap bm = new System.Drawing.Bitmap(width, height);

Вторая, на вызов метода:

CreateMergePhoto();

Код программы:

public static void Main(string[] args)
{
    Console.WriteLine("Нажмите клавижу для запуска...");
    Console.ReadKey();

    while(CntMerge < 300)
    {
        Console.WriteLine("Изображение: " + CntMerge);
        CreateMergePhoto();
    }

    Console.ReadKey();
}

Код метода:

private static void CreateMergePhoto()
{
    CheckImages();

    string img1 = PathToSave1;
    string img2 = PathToSave2;

    System.Drawing.Bitmap bm1 = new System.Drawing.Bitmap(img1, true);
    System.Drawing.Bitmap bm2 = new System.Drawing.Bitmap(img2, true);

    int width  = bm1.Width > bm2.Width ? bm1.Width : bm2.Width;
    int height = bm1.Height + bm2.Height;

    System.Drawing.Bitmap bm = new System.Drawing.Bitmap(width, height);
    bm.SetResolution(72, 72);

    string currTime = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");

    Graphics g = Graphics.FromImage(bm);
    g.FillRectangle(Brushes.Gray, 0, 0, width, height);
    g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
    g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

    g.FillRectangle(Brushes.Black, 0, height / 2, width, 56);
    g.DrawString(currTime, new Font("Arial", 52f), Brushes.White, 2, height / 2);

    bm.Save(PathToSave, System.Drawing.Imaging.ImageFormat.Jpeg);

    bm.Dispose();
    bm1.Dispose();
    bm2.Dispose();
}

Ответы

▲ 1Принят

Решил проблему благодаря комментарию

private static void CreateMergePhoto()
{
    CheckImages();

    string img1 = PathToSave1;
    string img2 = PathToSave2;

    using (System.Drawing.Bitmap bm1 = new System.Drawing.Bitmap(img1, true))
    {
        using (System.Drawing.Bitmap bm2 = new System.Drawing.Bitmap(img2, true))
        {
            int width = bm1.Width > bm2.Width ? bm1.Width : bm2.Width;
            int height = bm1.Height + bm2.Height;

            using (System.Drawing.Bitmap bm = new System.Drawing.Bitmap(width, height))
            {
                bm.SetResolution(72, 72);

                using (Graphics g = Graphics.FromImage(bm))
                {
                    string currTime = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");

                    g.FillRectangle(Brushes.Gray, 0, 0, width, height);
                    g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
                    g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);
                    g.FillRectangle(Brushes.Black, 0, height / 2, width, 56);
                    g.DrawString(currTime, fontArial, Brushes.White, 2, height / 2);

                    bm.Save(PathToSave, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
            }
        }
    }
}