2015-10-06 2 views
0

У меня есть .png файл, который я хочу рисовать, проблема в том, что я рисую этот png каждые 1/10 секунды, так что это 10 раз в секунду. Этот png рисуется с координатой X и Y как ее средняя точка, поэтому середина изображения представляет собой координаты X и Y.Неверный рисунок с использованием gdi +

Используя этот код:

private void frmMap_Paint(object sender, PaintEventArgs e) 
{ 
    Bitmap FlashLight = new Bitmap(
     Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + @"light.png"), 4000, 2160); 
    e.Graphics.DrawImage(FlashLight, new Point(mapX, mapY)); 
} 

проблема, хотя, при рисовании этого Png 10 раз в секунду, при изменении X и Y координаты результатов в много мерцания.

Есть ли у кого-нибудь идеи о том, как уменьшить или удалить мерцание? Я просмотрел рисунок растрового изображения и загрузил его после его рисования, я понятия не имею, как это сделать.

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

+0

Похоже, вы рисуете на Форме. Он имеет свойство «DoubleBuffered», что является первым шагом. Но не надейтесь на слишком много; использование Winforms для анимации довольно ограничено. – TaW

+3

Кроме того, вы перезагружаете растровое изображение на каждой итерации красок. Это не расточительно. Сделайте это только один раз. – Rotem

+0

@TaW Что вы рекомендовали бы использовать для этой анимации? Поскольку я просто перерисовываю png в новом месте, но проблема с перерисовкой заключается в том, что экран становится белым, а весь png перерисовывается. Это не должно быть хорошей анимацией, она может быть короткой, но просто не мерцает так много. – BramSnoek

ответ

0

Winforms определенно не очень подходит для анимации.

Вот предложение, вы можете или не можете найти достаточно хорошее:

Загрузите большой Image в PictureBox.Image и установить PictureBox.SizeMode = AutoSize.

Затем в вашей анимации Timer.Tick вы перемещаете PictureBox вокруг.

Вот маленький пример:

Timer timer = new Timer(); 
timer.Interval = 100; 
timer.Tick += timer_Tick; 

// when the timer runs.. 
timer.Enabled = !timer.Enabled; 

..Это перемещает PictureBox вокруг:

void timer_Tick(object sender, EventArgs e) 
{ 
    Point pt = new Point(pictureBox1.Left + offsetX, pictureBox1.Top + offsetY); 
    pictureBox1.Location = pt; 
} 

Обратите внимание, что расположение может идти в негатив без каких-либо проблем!

до центра начального местоположения использования изображения:

pictureBox1.Location = new Point(-(pictureBox1.Width - Width)/2, 
           -(pictureBox1.Height - Height)/2); 

Для гораздо лучшей поддержки анимации, вы можете рассмотреть возможность использования WPF.

+0

im pretty noob at this stuff atm, так что этот вопрос может показаться действительно глупым, но что вы имеете в виду с offsetX и offsetY – BramSnoek

+0

, потому что я знаю, что вы делаете, но мне нужно дать (известные) координаты X и Y, которые должны быть начальная точка картинки была перемещена или даже лучше средняя точка на картинке – BramSnoek

+0

вы хотите переместить изображение, не так ли? поэтому вам нужно изменить свое местоположение на какую-то сумму. для этого нужны две переменные. Чтобы центрировать начальное местоположение, вы рассчитываете, как это: pb.left = - (pb.width - form.width)/2; и т.п .. – TaW

Смежные вопросы