2015-06-13 7 views
4

Я вижу странное поведение изображения.Странное поведение изображения

У меня есть два метода, которые вычисляют изображение тепловой карты. один метод работает в потоке графического интерфейса пользователя, а другой - в фоновом потоке. Оба метода должны быть одинаковыми, а вывод как png кажется хорошим. Созданное изображение GUI-потока может загружаться, но созданный из фонового потока не является.

Я сохраняю вычисленное изображение как файл на своем жестком диске и загружаю его снова. Когда я загружаю его и назначаю его источнику изображения, он не равен нулю. Но когда программа оставляет метод выделения, image.source имеет значение NULL. Я не понимаю, почему.

Это код:

private void LoadImageClicked(object sender, RoutedEventArgs e) 
{ 
    this.ImageHeatMap.BeginInit(); 
    this.ImageHeatMap.Source = new BitmapImage(new Uri(@"HeatMapImage.png", UriKind.Relative)); 
    this.ImageHeatMap.EndInit(); 
} 

и это его, как я сохранить изображение как PNG:

public void SaveFile(BitmapSource source, string filePath) 
{ 
    using (var fileStream = new FileStream(filePath, FileMode.Create)) 
    { 
     BitmapEncoder encoder = new PngBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(source)); 
     encoder.Save(fileStream); 
    } 
} 

Интересно, что я не могу просмотреть свойство Image.Source.Height в отладке Режим. но с рабочим файлом я могу прочитать это свойство. Debug выглядит следующим образом: сообщение

Debug of Image.Source assignment

ошибки в английском (бесплатно перевод): "this.Image: heatMap.Source.Height" бросил исключение "System.IO.IOException" типа

Может кто-нибудь помочь мне понять, где проблема? Потому что я не понимаю, почему я не могу загрузить изображение. Я могу открыть его с помощью программы просмотра изображений Windows.

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

+0

GUI поток и фоновый поток используют один и тот же метод Save-? – DJmRek

+0

Да. Но тот, что работает с графическим интерфейсом, работает, но фон один нет. Я исправил это с помощью небольшого взлома/обходного пути, но было бы неплохо узнать, почему есть разница. – Jens

+0

Итак, я попробовал несколько сценариев и могу только воспроизвести ваши ошибки для Height, Width, Metadata, если файл, названный Uri don ' t в папке программ. Вы пробовали абсолютный Ури? Und es wär schön wenn man wüsste был dein 'ImageHeatMap' Object bei' BeginInit' und' EndInit' macht;) – DJmRek

ответ

-2

Когда речь заходит об объектах изображений в .Net, я обнаружил необходимость принудительного удаления. Использование метода .Dispose() любого класса, манипулирующего изображением, было достаточно, чтобы вывести его в файл. Вы могли бы подумать, что закрытие Stream приведет к этому выпуску, но это не так.

Редактировать: Это довольно паршиво из вас, чтобы проголосовать за то, что вы не понимали ответа. Я думал об удалении моего ответа, но я не думаю, что это в интересах сообщества. Вот связанная статья, которая объясняет, что я говорил дальше.

Why does Image.FromFile keep a file handle open sometimes?

+0

Ух, что? я не хочу распоряжаться своим изображением. – Jens

+0

Я не думаю, что вы понимаете, что делает. После Encoder.Save (...) вы вызываете Encoder.Dispose(), чтобы ресурсы были возвращены в систему и что он не блокирует файл. –

+0

Вы не понимаете мой вопрос/проблему. я знаю, что делает, и я также знаю, как его использовать - так почему бы вам не позвонить? гораздо лучше использовать код использования блока. Итак, почему ваше решение поможет мне? Мое изображение равно null после назначения. почему бы Dispose помочь мне? если я его уничтожаю, он равно нулю. Где смысл? – Jens

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