Как сделать автоматическое слайд-шоу изображений с использованием списка изображений и таймера в C#? - PullRequest
0 голосов
/ 07 января 2020

Как сделать слайд-шоу с автоматической сменой картинок в картинке? В настоящее время я использую imagelist, но он, кажется, не работает. Я хочу, чтобы таймер менял изображение каждые 3 секунды. это код таймера, который я использую. это хорошо работает, прежде чем нажимать кнопки каждые 3 секунды, но не работает с списком изображений. Я новичок в списке изображений и слайд-шоу, так что если у вас есть предложения по этому поводу, пожалуйста, сообщите мне Спасибо.

        private bool _timerEnabled;
        private async Task StartTimer()
        {
            _timerEnabled = true;
                int i = 0;
                while (_timerEnabled)
                {
                    i++;
                    if (i > 2) { i = 0; }
                    pictureBox2.Image = imageList1.Images[i];
                    bmp = new Bitmap(pictureBox2.Image, pictureBox2.Width, pictureBox2.Height);
                    pictureBox1.Refresh();
                    pictureBox2.Refresh();
                    await Task.Delay(3000);
                }
        }
        private async void timerStartButton_Click(object sender, EventArgs e)
        {
            timerStopButton.Enabled = true;
            timerStartButton.Enabled = false;
            if (_timerEnabled)
                return;
            await StartTimer();
        }
        private void timerStopButton_Click(object sender, EventArgs e)
        {
            timerStopButton.Enabled = false;
            timerStartButton.Enabled = true;
            _timerEnabled = false;
        }

слайд-шоу теперь работает нормально, но используемое изображение становится размытым. Как это исправить?

Исходное изображение enter image description here

Размытые результаты enter image description here

РЕДАКТИРОВАТЬ. после повторной проверки результат размытия получается из элемента управления imagelist, который автоматически устанавливает размер изображения 16,16. кажется, не могу получить его больше, чем 320 320. знаете, как сделать так, чтобы можно было использовать большее разрешение

1 Ответ

1 голос
/ 07 января 2020

Просто переместите int i из while l oop.

private async Task StartTimer() {
    _timerEnabled = true; 
    int i = 0; //Move this here
    while (_timerEnabled) { 
        i++;
        if (i > 2) { i = 0; }
        pictureBox2.Image =  imageList1.Images[i];
        pictureBox1.Refresh();
        pictureBox2.Refresh(); 
        await Task.Delay(3000); 
    } 
}

Или вы можете использовать встроенный таймер вместо того, чтобы заново изобретать колесо.

Timer timer1;
int i = 0;

//Form's constructor
public Form1
{
    timer1 = new Timer();
    timer1.Interval = 3000;
    timer1.Tick += new EventHandler(timer1_tick);
}

private void timer1_tick(object sender, EventArgs e)
{
    i++;
    if (i > 2) { i = 0; } 
    pictureBox2.Image = imageList1.Images[i];
    pictureBox1.Refresh();
    pictureBox2.Refresh(); 
} 

private async void timerStartButton_Click(object sender, EventArgs e) { 
    timerStopButton.Enabled = true;
    timerStartButton.Enabled = false; 
    if (timer1.Enabled) return;
    timer1.Enabled = True;
} 

private void timerStopButton_Click(object sender, EventArgs e) { 
    timerStopButton.Enabled = false;
    timerStartButton.Enabled = true;  
    timer1.Enabled = false; 
}
...