Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,714

Максимально быстрая загрузка изображения в Image

12.01.2023, 20:42. Показов 4752. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть обычный Image контрол, есть фото отснятое в 187 Мп формата .jpg, весом в 91 Мб, если открывать в Win 10 в стандартном просмоторщике он его открывает чуть ли не моментально, но видно, что отображает изначально что-то похожее на превью в худшем качестве и когда начинает зумить это фото, то видно что при приближении качество улучшается (т.е. грузит уже оригинал вместо превью, как мне кажется), у меня данное фото открывается за 6 сек, примерно столько же затрачивается на открытие на Mac и т.д., irfan view и ей схожие проги открывают примерно за сек 2-3, что тоже неплохо, так вот вопрос, как можно открыть фото также быстро, в чем хитрость?

Добавлено через 6 минут
Файл для понимания прилагаю ссылкой:
Тык
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.01.2023, 20:42
Ответы с готовыми решениями:

Загрузка изображения в Image с памяти устройства
Пользователь должен иметь возможность загрузить изображение из памяти устройства в Image. Это проект Xamarin Forms под Android, IOS, UWP....

Загрузка изображения из ресурсов в Image WPF
Ну никак не получается загрузить изображения из ресурса, всегда ошибка. Уже все что нашел в интернете проверил... Build Action -...

Загрузка изображения в Image с сохранении соотношения сторон изображения
загрузка изображения в Image(с фиксированным размером) при этом изображение должно сохранить соотношение сторон и полностью уместится в...

70
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
25.01.2023, 11:04
Студворк — интернет-сервис помощи студентам
Midian,
Полная загрузка и отображение 1.438 сек.
При уменьшении до 500 px - 0.8 с.
По ходу решил неожиданную проблему.
В момент передачи в Image оригинала вылетело исключение:

System.Runtime.InteropServices.COMExcept ion: 'UCEERR_RENDERTHREADFAILURE

Посмотрел здесь - https://learn.microsoft.com/ru... d-failures

В коде установил:
RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.Softwa reOnly;

И это работает, наверное у меня проблема с видеокартой (Intel)
На будущее - если огромные рисунки загружать в Image, то на всякий случай писать эту опцию - неизвестно какая карта у пользователя.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
25.01.2023, 11:24
Цитата Сообщение от proa33 Посмотреть сообщение
На будущее - если огромные рисунки загружать в Image, то на всякий случай писать эту опцию - неизвестно какая карта у пользователя.
Это же рендеринг через ЦП.
Наверное, лучше отлавливались это исключение.
Если оно есть, то значит видеокарта не справляется с обработкой и только тогда переключаться на обработку в ЦП.
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
25.01.2023, 11:45
Цитата Сообщение от Элд Хасп Посмотреть сообщение
отлавливались
Оно не ловится.
Ловятся только исключения в управляемом коде.
Это исключение - InteropServices.COMException, то есть в неуправляемом коде.
У меня проблема со встройкой Intel где видеопамять динамическая и выделяется под разрешение монитора и не ожидает выделения в видеобуфере кадра 16000 х 11000
Если видеопамять статическая тогда нет проблем.
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,714
25.01.2023, 11:57  [ТС]
proa33, можно вообще код ваш увидеть, а лучше проект?
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
25.01.2023, 16:28
Добавить ссылку System.Drawing
Через Nuget добавить пакет PhotoSauce.MagicScaler
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using PS = PhotoSauce.MagicScaler;
 
namespace Collector.Service
{
    internal class LoadImage
    {
        public long LoadTime;
        public WriteableBitmap Wbmp;
 
        public Task<BitmapSource> FromFile ( string path, int resizeWidth = 0 )
        {
            return Task.Run (() =>
            {
                Stopwatch sw = Stopwatch.StartNew ();
                PS.ProcessImageSettings sett = new PS.ProcessImageSettings ();
                if ( resizeWidth > 0 )
                {
                    sett.Width = resizeWidth;
                    sett.ResizeMode = PS.CropScaleMode.Max;
                    sett.Interpolation = PS.InterpolationSettings.NearestNeighbor;
                }
                PS.ProcessingPipeline pipe = PS.MagicImageProcessor.BuildPipeline (path, sett);
                PS.IPixelSource source = pipe.PixelSource;
                PixelFormat pixelformat = PixelFormats.Gray8;
                int bytePerPix = 1;
                if ( source.Format == PS.PixelFormats.Bgr24bpp ) { pixelformat = PixelFormats.Bgr24; bytePerPix = 3; }
                if ( source.Format == PS.PixelFormats.Bgra32bpp ) { pixelformat = PixelFormats.Bgra32; bytePerPix = 4; }
                // TODO: PS.PixelFormats.Planar: Y8bpp, Cb8bpp, Cr8bpp
 
                byte[] pixelArray = new byte[ source.Width * source.Height * bytePerPix ];
                Span<byte> span = new Span<byte> (pixelArray);
                source.CopyPixels (new System.Drawing.Rectangle (0, 0, source.Width, source.Height), source.Width * bytePerPix, span);
 
                App.Current.Dispatcher.Invoke (() =>
                {
                    Wbmp = new WriteableBitmap (pipe.PixelSource.Width, pipe.PixelSource.Height, 96, 96, pixelformat, null);
                    Wbmp.WritePixels (new Int32Rect (0, 0, source.Width, source.Height), pixelArray, source.Width * bytePerPix, 0);
                });
                sw.Stop ();
                LoadTime = sw.ElapsedMilliseconds;
                return Wbmp as BitmapSource;
            });
        }
    }
}
2
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,714
25.01.2023, 20:02  [ТС]
proa33, в общем внедрил ваш код, загрузил картинку еще большего разрешения в 400 мп, стандартно грузит у меня за 15 сек, а в вашем случае грузи т оригинал за 8 сек, неплохо, спасибо, буду пробовать внедрить это в свой проект
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
25.01.2023, 20:24
Цитата Сообщение от proa33 Посмотреть сообщение
Ловятся только исключения в управляемом коде.
Это исключение - InteropServices.COMException, то есть в неуправляемом коде.
Сразу оговариваю, что я не спец в этом вопросе, но вроде мне где попадалась тема за обработку на Шарпе COM-исключений.
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,714
25.01.2023, 22:47  [ТС]
Цитата Сообщение от proa33 Посмотреть сообщение
RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.Softwa reOnly;
Что-то странно он работает, карта у меня RTX 4090, если этот параметр не включать, картинку в 400 Мп грузит за 8 сек, если включить - то за 6 сек, проц у меня Core i9 10900KF (10 ядер и 20 потоков), SSD NVme, на карте должно грузить быстрее, но почему-то цп шустрее получается, странно

Тесты делал на вот этой картинке https://dropmefiles.com/Iyv6l
400 Мп она
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
25.01.2023, 23:01
Midian, У меня на встройке без этого флага вообще вылетает.
Наверное драйвера шалят.
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,714
25.01.2023, 23:03  [ТС]
proa33, попробуйте картинку у себя в 400 мп загрузить, сколько у вас будет грузиться интересно
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
25.01.2023, 23:46
Midian, Картинку не вывело, потому что WriteableBitmap выбросил OutOfMemoryException - слишком большой размер.
Замер до этого фрагмента, а это 98% всей нагрузки показал 6.438 сек
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,714
26.01.2023, 08:13  [ТС]
Цитата Сообщение от proa33 Посмотреть сообщение
Картинку не вывело, потому что WriteableBitmap выбросил OutOfMemoryException - слишком большой размер.
Сделайте x64 приложение, уберите галку в свойствах проекта из x86 и все запустится
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
26.01.2023, 14:20
Midian, Да, так работает.
Время загрузки - 6.0 сек
Время отрисовки в Image - 0.6 сек
Полное время 6.6
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.01.2023, 14:45
Цитата Сообщение от proa33 Посмотреть сообщение
Время отрисовки в Image - 0.6 сек
Дастиш фантастиш....
Если будет время - на выходных сам попробую.
С таким временем отрисовки, конечно, самое оптимально это загрузка сначала низкого качества и фоновая загрузка полного качества.
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,714
26.01.2023, 15:00  [ТС]
proa33, такой еще вопрос, данный метод у меня долго отрабатывает:
C#
1
source.CopyPixels(new System.Drawing.Rectangle(0, 0, source.Width, source.Height), source.Width * bytePerPix, span);
Причем он быстрее работает в пустом проекте, чем в моем в который я внедрил, напрашивается идея, а можно ли этот метод например выполнить на стороне ГПУ? чтобы ускорить копирования данных? Просто если можно, то как?)
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,714
26.01.2023, 15:04  [ТС]
Картинку в 187 Мп копирует почти 6 сек, я не могу понять почему так происходит, в пустом проекте копирует за 2,5 сек
Миниатюры
Максимально быстрая загрузка изображения в Image  
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,714
26.01.2023, 15:09  [ТС]
Вот пустой проект, та же картинка, процесс выполняется и там и там в отдельном потоке:
Миниатюры
Максимально быстрая загрузка изображения в Image  
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
26.01.2023, 15:24
Элд Хасп,
весь код загрузки.
UpdateLayout отработает уже ПОСЛЕ отображения - это видно по инфе в image.Source, да и визуально это видно.
Сколько раз запускал получается:
core - 6.0 sec
full - 6.6 sec
Может мерять надо по другому алгоритму?
C#
1
2
3
4
5
6
7
8
9
10
11
                Stopwatch sw = Stopwatch.StartNew ();
                LoadImage loader = new LoadImage ();
                RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly;
                void imageUpdated(object sender, EventArgs e)
                {
                    sw.Stop ();
                    image.LayoutUpdated -= imageUpdated;                                   
                    tb.Text = $"core-{loader.LoadTime}, full-{sw.ElapsedMilliseconds}, width-{image.Source.Width}, height-{image.Source.Height}";
                };  
                image.Source = await loader.FromFile ("white.jpg");
                image.LayoutUpdated += imageUpdated;
Добавлено через 14 минут
Забыл убрать sw.stop() с прошлого раза
Результаты такие
core - 6.584
full - 6.641
Даже меньше на Image 0.06 сек
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
26.01.2023, 15:34
Цитата Сообщение от proa33 Посмотреть сообщение
UpdateLayout отработает уже ПОСЛЕ отображения
Не обязательно.
Он срабатывает при любом изменении макета.
Например, после загрузки может сработать на изменение размера картинки, так как это меняет макет.
Но может не сработать на отрисовку картинки, поскольку это не меняет макет.

Добавлено через 6 минут
Тут ещё такой нюанс, проход визуального дерева происходит дважды.
На первом определяются размеры всех элементов и строится макет. Сами элементы не рендерятся.
На втором проходит происходит рендеринг элементов по уже определённым размерам.
Если при рендеринге изменяется размер элемента, то нужно делать недействительным макет, чтобы опять вернуться к первому шагу.

Я с этим столкнулся когда делал: Присоединённые свойства (Attached Property) для всплывающей привязки из шаблонов данных к Canvas и Grid.
Оказалось изменять Grid.Row/Column нужно вне прохода измерения (1 шага). Иначе изменения будут учитываться только при следующем рендеринге. Там я это решил через асинхронное изменение в Диспетчере.
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
26.01.2023, 15:51
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не обязательно.
Предположим. Перейдем к "полевым" испытаниям на природе.
Поставим точку останова на image.LayoutUpdated += imageUpdated;
В этой точке Image получил Source но еще отобразил.
Жмем F5 - продолжить и видим МГНОВЕННОЕ отображение рисунка. Задержка визуально - 0.

Добавлено через 6 минут
Midian, Это первый рисунок в 93 мв? Для него этот участок кода у меня выполняется 1.0 сек
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2023, 15:51

Загрузка изображения в Image
C помощью OpenDialog пытаюсь загрузить изображение в Image но выдаёт ошибку Unknow picture file extention if OpenDialog1.Execute...

Загрузка изображения в Image
Доброго времени суток. Имеется несколько около сотни изображений, в зависимости от того или иного клика компонента, конкретное...

Загрузка изображения в компоненту Image
Вообщем, я должен загрузить изображение, однако их много и для соответствия нужно загружать нужный, я решил что нужно так ...

Загрузка изображения в image (idHTTP)
Здравствуйте! Пытаюсь загрузить изображение с сайта в Timage, код компилируется без ошибок изображение скачивается, проблема состоит в том...

Очистка image и загрузка png изображения
Столкнулся с небольшой проблемкой. Есть программа, которая должна выводить на форму изображения (методом Canvas) и соответственно...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru