Читать изображение из потоковой базы данных - PullRequest
1 голос
/ 17 декабря 2010

Уважаемые, у меня проблема с потоковой базой данных.
Я уже написал изображение там, и теперь я хочу вспомнить и поместить его в PictureBox.
Кто-нибудь может подсказать, как мне это сделать?
Заранее большое спасибо.

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010
  1. Вызовите метод ExecuteNonQuery, чтобы получить байтовый массив с изображением
  2. Создайте новый MemoryStream вокруг байтового массива (не уничтожайте поток, поскольку объект Image будет продолжать использоватьit)
  3. Вызовите Image.FromStream для чтения потока
  4. Установите для этого изображения свойство Image PictureBox.
1 голос
/ 17 декабря 2010

Когда изображение маленькое или трафик незначительный, любой из методов, упомянутых выше, работает, и они отлично справляются с демоверсией.Вещи начинают выходить из-под контроля, когда размер изображения увеличивается, потому что все эти решения требуют, чтобы все изображение было сохранено в виде байтового массива в памяти.Если нагрузка на сервер значительна, наличие всех этих копий файлов изображений, занимающих ценное пространство адресного пространства процесса, увеличивает объем и может существенно повлиять на производительность.

Это , из которого можно читать избаза данных с семантикой потока, так что полная копия файла никогда не сохраняется в памяти:

Предоставляет DataReader способ обрабатывать строки, содержащие столбцы с большими двоичными значениями.Вместо загрузки всей строки SequentialAccess позволяет DataReader загружать данные в виде потока.Затем вы можете использовать метод GetBytes или GetChars, чтобы указать местоположение байта для запуска операции чтения, и ограниченный размер буфера для возвращаемых данных.

  • чтение данных в блоках, используяSqlDataReader.GetBytes
  • записать данные в выходной поток кусками

Последний пункт немного проблематичен.Вы можете либо записать поток в локальную папку WWW-сервера, которая фактически сопоставлена ​​с сайтом, а затем вернуть URL-адрес этого файла.Или у вас может быть URL, который читает само изображение и записывает изображение прямо в кэш вывода ASP.Первый метод может окупиться за часто используемые изображения, так как кэшированный файл может обслуживать несколько запросов, но требует логики аннулирования и очистки.Второй метод лучше подходит для ненужных обращающихся к нему изображений, но требует правильной логики маршрутизации в вашем приложении.

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

1 голос
/ 17 декабря 2010

Самый простой способ IMO - прочитать все данные из базы данных и записать их в MemoryStream. Перемотайте поток назад (установите Position=0) и затем используйте new Bitmap(stream) или Image.FromStream. Обратите внимание, что вы должны не распоряжаться потоком ... растровое изображение фактически "владеет" потоком после его создания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...