Как изменить ширину изображения одновременно по центру и со сжатием?

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

Я пытаюсь простенькую анимацию подкидывания монетки и тем самым нахождение победителя: орла или решки.

async void TossCoin() {
  var random = new Random();
  await Task.Run(() => {
    //Количестов поворотов монетки
    var number = random.Next(9, 11);
    // Цикл соответствует количеству поворотов монетки
    for (int i = 0; i < number; i++) {
      // Если поворот нечетный, то сторона решки сжимается до тех пор, пока не достигнет ширины 0, а затем орел начинает
      // наоборот набирать ширину, таким образом должна создаваться иллюзия вращения монетки.
      if (i % 2 != 0) {
        while (imageTail.Width > 0) {
          imageTail.Invoke(() => imageTail.Width--);
        }
        imageTail.Invoke(() => imageTail.Visible = false);
        imageEagle.Invoke(() => imageEagle.Visible = true);
        while (imageEagle.Width != 200) {
          imageEagle.Invoke(() => imageEagle.Width++);
        }
      }
      // То же самое, но наоборот
      if (i % 2 == 0) {
        while (imageEagle.Width > 0) {
          imageEagle.Invoke(() => imageEagle.Width--);
        }
        imageTail.Invoke(() => imageTail.Visible = true);
        imageEagle.Invoke(() => imageEagle.Visible = false);
        while (imageTail.Width != 200) {
          imageTail.Invoke(() => imageTail.Width++);
        }
      }
    }
    // Если последний поворот остановилься на стороне решки, то победа засчитывается решке.
    if (imageTail.Visible == true) {
      Coin.CountOfTails++;
      labelCountEagleWins.Invoke(() => labelCountTailsWins.Text = $ "Решка победила {Coin.CountOfTails} раз");
    }
    // То же самое, но наоборот
    else {
      Coin.CountOfEagles++;
      labelCountEagleWins.Invoke(() => labelCountEagleWins.Text = $ "Орёл победил {Coin.CountOfEagles} раз");
    }
  });
}

Проблема в том, что при создании PictureBox, куда помещено изображение одной из двух сторон одной монеты, можно указать только один SizeMode.

var imageEagle = new PictureBox {
  Image = Resources.ImageEagle,
    Location = new Point(this.Width - this.Width / 3 - 55, this.Height / 3 - 40),
    Size = new Size(0, 200),
    Visible = false,
    SizeMode = PictureBoxSizeMode.StretchImage,
};

Таким образом я не могу указать сразу два SizeMode. Либо StretchImage, либо CenterImage. Получается, что в процессе монетка либо сжимается (если указать StretchImage), вместо того, чтобы удалять часть изображения, либо централизуется (если указать CenterImage), но при этом будет терять часть изображения, вместо сжатия.
Можно ли каким-то образом убить двух зайцем одним выстрелом, чтобы и сжимать, сохраняя изображение, и централизовать сжатие?

Ответы

Ответов пока нет.