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

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

19.01.2013, 23:42. Показов 8457. Ответов 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
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru