Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/41: Рейтинг темы: голосов - 41, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 21

Асинхронно загрузить изображение в Image

19.01.2013, 23:42. Показов 8289. Ответов 36
Метки нет (Все метки)

Если загружать большое изображение по принципу Image.Source, то интерфейс будет тупить некоторое время. Есть ли у кого пример асинхронной загрузки изображения ?
Спасибо.
 Комментарий модератора 
ЗАпрещено задавать свои вопросы в чужих темах
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2013, 23:42
Ответы с готовыми решениями:

Асинхронно загрузить изображение в Image
Me.Text1 = CDate(Me.Text1) + 1

Программа для Windows Store: как загрузить изображение в Image
Всем привет. Начал писать программу для windows store на c#. И вопрос. Есть элемент image нужно из кода присвоить ему изображение. В...

Загрузить изображение в Image
Мне нужно программно изменить свойство Sourse Пишу так Image1.Source = new BitmapImage("Assets/A1(2).png");выдает ошибку: функция...

36
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
21.01.2013, 23:50
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Торможение обходят уменьшением изображения до оптимального размера.
Как быть, если нужно отобразить именно полноразмерное изображение, но избежать зависания системы на стадии его загрузки?
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
22.01.2013, 10:38
Цитата Сообщение от kolorotur Посмотреть сообщение
Как быть, если нужно отобразить именно полноразмерное изображение, но избежать зависания системы на стадии его загрузки?
http://msdn.microsoft.com/ru-r... s.95).aspx
http://bsix12.com/deepzoom-composer/

Пример: http://bsix12.com/monalisa/

Добавлено через 4 минуты
Цитата Сообщение от Hard-Rock Посмотреть сообщение
Я уменьшаю картинки перед тем как отправлять их в Image.
У меня подвисает если размеры картинки 10000х7500. Я уменьшаю её до 1024х768 и зависания исчезают!
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
22.01.2013, 10:53
Цитата Сообщение от LeniumSoft Посмотреть сообщение
http://msdn.microsoft.com/ru-ru/libr...(v=vs.95).aspx
http://bsix12.com/deepzoom-composer/
Пример: http://bsix12.com/monalisa/
Спасибо за ссылки, но вопрос остается в силе: как устранить зависание приложение на время загрузки изображения в память компьютера?
Ведь перед тем, как производить манипуляции с изображением, его сначала надо бы подгрузить в память из внешнего источника (накопитель, сеть).

Если есть готовые решения, было бы здорово узнать.
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
22.01.2013, 10:53
Цитата Сообщение от LeniumSoft Посмотреть сообщение
У меня подвисает если размеры картинки 10000х7500
да неужели? всего каких-то 75 мегапикселей, и уже зависает? картинка весит всего-лишь 300 МБ - должно отрисовывать мгновенно ....

Не по теме:

куда катится мир?!

0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
22.01.2013, 11:10
Цитата Сообщение от kolorotur Посмотреть сообщение
как устранить зависание приложение на время загрузки изображения в память компьютера
Фишка в том что большая картинка загружается быстро! Ну по крайней мере у меня! Тоесть формирование BitmapImage проходит меньше чем за секунду. Авот после image1.Source = bitmapImage приложение виснет на четыре секунды!

Цитата Сообщение от nio Посмотреть сообщение
да неужели? всего каких-то 75 мегапикселей, и уже зависает? картинка весит всего-лишь 300 МБ - должно отрисовывать мгновенно ....
Я не говорил что она у меня должна отрываться мгновенно! Я специально увеличил имеющееся изображение для вызывания торможения.

Добавлено через 6 минут
Цитата Сообщение от nio Посмотреть сообщение
картинка весит всего-лишь 300 МБ
Ну и поправочка! Моя картинка весит 25 метров! Качество знаете ли не ахти! А 25 метров скачивается с флэшки за секунду. Потому как флэшка качает 28MB/s.
Так что виснет именно отрисовка в Image.
0
22.01.2013, 11:27

Не по теме:

Цитата Сообщение от LeniumSoft Посмотреть сообщение
Моя картинка весит 25 метров
10000х7500х4 = 300 000 000 Байт (цветное изображение с альфаканалом)
10000х7500х3 = 225 000 000 Байт (цветное изображение без альфаканала)
10000х7500х1 = 75 000 000 Байт (полутоновое (256-цветное) изображение)
10000х7500 / 8 = 9 375 000 Байт (бинарное изображение)
Не надо путать размер jpg-файла с размером картинки, при отображении все равно происходит распаковка (кстати операция, которая тоже требует времени)

0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
22.01.2013, 11:43
Цитата Сообщение от nio Посмотреть сообщение
10000х7500х4 = 300 000 000 Байт (цветное изображение с альфаканалом)
10000х7500х3 = 225 000 000 Байт (цветное изображение без альфаканала)
10000х7500х1 = 75 000 000 Байт (полутоновое (256-цветное) изображение)
10000х7500 / 8 = 9 375 000 Байт (бинарное изображение)
Не надо путать размер jpg-файла с размером картинки, при отображении все равно происходит распаковка
Вы к чему это всё ведёте? Создателю темы нужно выяснить каким образом отобразить большое изображение без зависания. Мы тут можем поднять кучу материала из википедии или пройтись по внутреннему строению файлов с картинками. Это делу не поможет! Я хотел показать что подвисает именно Image. Соответственно нужна альтернатива.
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
22.01.2013, 12:05
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Вы к чему это всё ведёте?
К тому, что отобразить картинку такого объема (размера) мгновенно не получится по следующим причинам:
1) Чтение файла такого объема занимает время
2) Декодирование картинки из jpg (или другого формата) требует времени
3) Масштабирование (если выводится не в масштабе 1:1) для отображения на экране требует времени

Учитывая выше перечисленное делаем вывод: при нынешнем уровне аппаратных средств выполнение задачи по мгновенному выводу картинки размером 300 МБ не возможно. Против математики и физики не попрешь.

Цитата Сообщение от LeniumSoft Посмотреть сообщение
Соответственно нужна альтернатива.
Если бы это было возможно, это уже сделали бы давно, но я не видел ни одного графического редактора, который бы смог это сделать (среди платных в том числе).
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
22.01.2013, 12:47
Цитата Сообщение от nio Посмотреть сообщение
Если бы это было возможно, это уже сделали бы давно, но я не видел ни одного графического редактора, который бы смог это сделать (среди платных в том числе).
DeepZoom! Картинка разрезается на кучу более маленьких. Создаётся xml с метаданными. После чего этот xml скармливаем уже готовому контролу MultiscaleImage. Либо как я и сказал уменьшать размер изображения до нужного.

Добавлено через 23 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            LoadImage();
        }
 
        private void LoadImage()
        {
            BitmapImage bitmapImage = GetBitmap(@"путь к картинке");
 
            image1.Source = bitmapImage;            
        }
 
        private BitmapImage GetBitmap(string path)
        {
            Stream stream = new FileStream(path, FileMode.Open);
 
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.BeginInit();
 
            bitmapImage.StreamSource = stream;
            bitmapImage.DecodePixelWidth = 1024;
 
            bitmapImage.EndInit();
 
            return bitmapImage;
        }
Это мой код! Даже без асинхронности работает без тормозов.
Ну а если уш нужна паралельность то:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            LoadImage();
        }
 
        private async void LoadImage()
        {
            BitmapImage bitmapImage = await GetBitmap(@"путь к файлу");
 
            image1.Source = bitmapImage;            
        }
 
        private Task<BitmapImage> GetBitmap(string path)
        {
            Stream stream = new FileStream(path, FileMode.Open);
 
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.BeginInit();
 
            bitmapImage.StreamSource = stream;
            bitmapImage.DecodePixelWidth = 1024;
 
            bitmapImage.EndInit();
 
            return Task.FromResult<BitmapImage>(bitmapImage);
        }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
22.01.2013, 15:14
Цитата Сообщение от LeniumSoft Посмотреть сообщение
C#
1
bitmapImage.DecodePixelWidth = 1024;
Хмм... А можно это как-то указать в разметке, чтобы работало с привязкой данных?
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
22.01.2013, 15:38
Цитата Сообщение от kolorotur Посмотреть сообщение
Хмм... А можно это как-то указать в разметке, чтобы работало с привязкой данных?
Щас проверю!

Добавлено через 6 минут
XML
1
2
3
4
5
        <Image x:Name="image1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Image.Source>
                <BitmapImage UriSource="путь к файлу" DecodePixelWidth="1024" />
            </Image.Source>
        </Image>
Добавлено через 1 минуту
Только учти что после инициализации изменения свойств у BitmapImage игнорируются!

Добавлено через 13 минут
kolorotur, ты меня удивил! Я думал ты всё знаешь!
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
22.01.2013, 16:37
Цитата Сообщение от LeniumSoft Посмотреть сообщение
XML
1
2
3
4
5
        <Image x:Name="image1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Image.Source>
                <BitmapImage UriSource="путь к файлу" DecodePixelWidth="1024" />
            </Image.Source>
        </Image>
Спасибо!
Да уж, до этого мог бы и сам догадаться...
Однако, при включенной виртуализации в режиме Recycling по кругу выдает одни и те же картинки

Цитата Сообщение от LeniumSoft Посмотреть сообщение
Я думал ты всё знаешь
Я даже не знаю как вас зовут (а людей планете Земля - что-то около 7 млрд), а вы прям-таки "всё".
Если серьезно, то я WPF изучаю "без году неделю", потому не знаю очень даже много. Сейчас вот новую тему буду создавать.
0
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 21
22.01.2013, 18:58  [ТС]
А для, Async / Await нужна 11-ая студия ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
22.01.2013, 19:01
12-я
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2013, 19:25
kolorotur, 11 == 2012
0
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 21
22.01.2013, 19:56  [ТС]
спасибо
0
108 / 7 / 3
Регистрация: 29.06.2012
Сообщений: 28
02.07.2015, 08:09
kolorotur, Я показываю в программе некоторые файлы с изображениями, находящиеся на сетевом диске. Воспользовался вашим советом. Всё отлично сработало! Некоторые подробности:
Сначала хотел через async/await сделать, но "BitmapImage is not awatiable".
В итоге нашёл ваш код, малость подправил его (у вас ошибка в
C#
1
2
3
4
 public static string SetSource(Image img)
   {
      return img.SetValue(SourceProperty, value);
   }
не хватает параметра "string value").
Ну и в методе OnSourceChanged я не создаю никакого потока, просто вызываю свой метод получения иконки предпросмотра ("предиконки") обычным способом, в основном потоке программы.
А в XAML привязываю так:
XML
1
<Image Source="{Binding DefaultIcon}" async:AsyncImageLoader.Source="{Binding FilePath, IsAsync=True}">
Что позволяет показывать иконку типа "Загрузка...", которая затем заменяется на предиконку изображения по мере подгрузки. Прямо как в Проводнике Windows и без лишних заморочек с потоками
Огромное спасибо за ваше сообщение. Очень помогло!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2015, 08:09

Загрузить изображение в Image из памяти
Я загрузил изображение в память таким способом: hhh = CreateFile(&quot;d:\\Tu-142-1986.jpg&quot;, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,...

Загрузить изображение из ресурсов в объект Image
Нужно загрузить изображение из ресурсов в объект Image. Добавлено через 30 секунд И в Grid...

Загрузить изображение из Stream в Image или в PictureBox
через диалог выбрал файл записал в Stream как мне теперь закинуть его в пиктури бокс ? напишите кто нибудь решение)) спасибо ...

Асинхронно загрузить данные
Есть личный кабинет, при входе отображается имя пользователя и в скобочках его балас(считается в 1с) Как сделать чтобы баланс загружался...

Асинхронно загрузить картинку на сервер, и вывести ее пользователю
Как можно, асинхронно вывести все изображения из директории пользователю(включая загруженную им же)? Вот код контроллера using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru