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