Изменение изображения в изображении WPF из последовательности изображений на жестком диске делает изображение черным и делает его менее отзывчивым - PullRequest
2 голосов
/ 15 сентября 2011

У меня есть таймер, и на каждом тике я хочу взять файл изображения с жесткого диска и изменить изображение, отображаемое в Image с этим фрагментом, если код

  Application.Current.Dispatcher.BeginInvoke(
            DispatcherPriority.Render,
            new Action(() => CameraImageBox.Source =
                             (ImageSource)new BitmapImage(new Uri(e.FileName))));

После нескольких десятков изображений управление изображением становится черным, и весь пользовательский интерфейс становится совершенно не отвечающим.Как я могу избежать затемнения и улучшить производительность во всем?

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Я попробовал ваш код в таймере диспетчера (задержка 100 миллисекунд), который перебирает сотни хороших изображений размером 800 * 680 в одно и то же DispatcherPriority.Render.

public partial class Window3 : Window
{
    private int i = 0;

    private DispatcherTimer timer
      = new DispatcherTimer(DispatcherPriority.Render); 

    public Window3()
    {
        InitializeComponent();

        timer.Tick += new EventHandler(timer_Tick);
        timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
        timer.IsEnabled = true;
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        imgChanging.Source
             = (ImageSource)new BitmapImage(
                   new Uri("Images/Icon" + ((i++ % 100) + 1) + ".png",
                   UriKind.RelativeOrAbsolute));
     }
}  

Мое приложение работает нормальнос прошлых 10 минут. Кажется, что-то не так в вашем коде.Можете ли вы предоставить более подробную информацию?

1 голос
/ 15 сентября 2011

Изображения не выпускаются после использования. Вы должны изменить ChacheOption источника изображений. Кроме того, вы должны использовать DispatcherTimer в WPF.

DispatcherTimer:

    DispatcherTimer t = new DispatcherTimer();
    t.Interval = new TimeSpan(0, 0, 1);
    t.Tick +=new EventHandler(t_Tick);
    t.Start();

Установить изображение:

private void SetImage(Uri loc)
    {
        Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
            {

                BitmapImage  image = new BitmapImage();
                image.BeginInit();
                image.UriSource = loc;
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.EndInit();
                imgDisplay.Source = image;
            }
            ));

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...