Прямо сейчас у меня есть приложение, которое загружает кучу миниатюр в элементы управления PictureBox. Иногда более ста за раз. Изображения создаются с использованием Image.FromStream (MemoryStream), а поток памяти представляет каждый файл JPG.Загрузка изображения и зависимость потока/файла
В настоящее время, как только я звоню в Image.FromStream, я назначаю ссылку на окно с изображением, а затем сразу после того, как я Flush() и Dispose() поток.
Согласно документации, я не должен выпускать поток, пока не закончится с изображением. Однако у меня не было никаких ошибок. Элементы управления PictureBox могут воспроизводиться в течение всего дня с помощью уменьшенных изображений даже после того, как потоки памяти уже давно удалены.
Однако, если я попытаюсь каким-либо образом получить доступ к этим изображениям, например, вызвать функцию сохранения, он выдает ошибку.
Если Bitmap имеет зависимость от потока памяти или файловый поток, он будет распоряжаться источником при утилизации этого? Или это только тогда, когда он создает поток, используя Bitmap.FromFile?
Является ли утилитой MemoryStream немедленно, как будто я рассматриваю ОК? PictureBox должен каким-то образом кэшировать изображение. У меня никогда не было ошибки, потому что мне не нужно касаться изображения после его установки.
Я также замечаю, что мои PictureBoxes долго рисуют на их родительском элементе управления. Я не уверен, что это связано с тем, что у меня слишком много элементов управления, или потому, что есть задержка, когда изображение раскрашено в PictureBox.
Я знаю, что при создании нового растрового изображения с параметром файла он фактически не загружает содержимое файла, пока он не понадобится. Моя проблема в том, что я не хочу, чтобы каждая операция OnPaint была отложена файлом, прочитанным, я хочу убедиться, что данные предварительно загружены до того, как я попытаюсь нарисовать элементы управления, иначе я становлюсь мерцающим и медленным.
Есть ли хороший способ заставить изображение быть предварительно загруженным? Каковы расхождения между Image.FromFile, Image.FromStream, новым Bitmap (fileName) и т. Д.? Может ли кто-нибудь из них сразу загрузить все байты или задержится до тех пор, пока они не понадобятся?
Вот мой код:
MemoryStream ms = new MemoryStream(bytes); // byte[] array
pictureBox.Image = Image.FromStream(ms);
ms.Flush();
ms.Dispose();
Вы прочитали мои результаты из моего тестирования? Я выбрал поток, используемый для Image.FromStream, но все же мои элементы управления PictureBox все еще красивы. Я просто пытаюсь понять, почему это происходит, чтобы лучше понять, как получить лучшую производительность от PictureBoxes. –
@Moozhe, я полагаю, MemoryStream Dispose() фактически не уничтожает ** память из-за реализации MemoryStream: он использует простой массив байтов (который будет собирать мусор). Не могли бы вы попробовать эксперимент с классом FileStream? –
Это звучит правильно, поскольку MemoryStream не выделяет память ... PictureBox должен содержать ссылку на адрес памяти массива byte [], поэтому он не собирает мусор. –