Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Загрузить и выгрузить Bitmap из Stream [D7, XP]


Alex_C ©   (2011-09-23 11:46:00) 

Есть Stream, куда кроме основных данных необходимо запомнить Bitmap.
Делал так

       // Копируем битмап в дополнительный Stream
       BitMapStream := TMemoryStream.Create;
       BitMap.SaveToStream(BitMapStream);
       // В основной поток записываем размер получившейся картинки
       SizeOfBitMap := BitMapStream.Size;
       Stream.Write(SizeOfBitMap, SizeOf(Int64));
       // Создаем массив из потока
       SetLength(BitMapBuff, SizeOfBitMap);
       BitMapStream.Seek(0, 0);
       BitMapStream.ReadBuffer(BitMapBuff[0], SizeOfBitMap);
       // Записываем его в основной поток
       Stream.WriteBuffer(BitMapBuff[0], SizeOfBitMap);


Не знаю, на сколько это коряво, но записывается в основной поток вроде как верно.
А вот при попытке считать - получается ошибка:


         // Получаем размер картинки картинки
         Stream.Read(SizeOfBitMap, SizeOf(Int64));
         // Создаем массив
         SetLength(BitMapBuff, SizeOfBitMap);
         // Считываем массив из потока
         Stream.ReadBuffer(BitMapBuff[0], SizeOfBitMap);
         // Создаем временный поток и записываем туда массив
         BitMapStream := TMemoryStream.Create;
         BitMapStream.WriteBuffer(BitMapBuff[0], SizeOfBitMap);

         Image1.Picture.Bitmap.LoadFromStream(BitMapStream);


При попытке загрузки в Image1 вылетает ошибка...


Alex_C   (2011-09-26 10:47:00) [1]


> BitMapStream.Position := 0;


Спасибо! Именно в этом и была проблема - все заработало!
На будущее учту, что позиция при LoadFromStream в 0 не устанавливается!


antonn (work)   (2011-09-24 09:01:00) [2]

мы смотрим ведь код автора, а не что там может быть


brother   (2011-09-24 07:23:00) [3]

> понял, почему в LoadFromStream нет смещения на 0

в TMemoryStream может быть не одна картинка, а если будем в LoadFromStream всегда позишин=0 тогда другие картинки не загрузим...


brother   (2011-09-24 07:20:00) [4]

> BitMapStream.Position := 0;
>         Image1.Picture.Bitmap.LoadFromStream(BitMapStream)
> ;

уже натыкался на это... думал... потом понял, почему в LoadFromStream нет смещения на 0 (хотя я думал оно подразумевается)...


Омлет   (2011-09-23 16:00:00) [5]

А, я понял, о чем вы )
Правильно, в данном примере надо в 0 выставлять позицию:

         BitMapStream := TMemoryStream.Create;
         BitMapStream.WriteBuffer(BitMapBuff[0], SizeOfBitMap);
          BitMapStream.Position := 0;
         Image1.Picture.Bitmap.LoadFromStream(BitMapStream);


Плохиш   (2011-09-23 15:49:00) [6]


> Омлет ©   (23.09.11 15:35) [12]

Ты б исходный дерьмокод посмотрел для начала, а после реализацию ReadStream тоже не мешало бы посмотреть.


antonn   (2011-09-23 15:38:00) [7]

после BitMapStream.WriteBuffer() position ведь меняется?

(у меня нет дельфи под рукой чтобы проверить)


stas   (2011-09-23 15:38:00) [8]

Alex_C   (23.09.11 11:46)
А размер считывается правильный?


Омлет   (2011-09-23 15:35:00) [9]

> antonn ©   (23.09.11 15:26) [11]
> он из стрима читает, сначала int64, потом массив. нет?


Да, поэтому указатель в 0 не надо ставить.


antonn   (2011-09-23 15:26:00) [10]


> Чушь. В данном случае как раз не надо, там не с начала битмап
> лежит.

он из стрима читает, сначала int64, потом массив. нет?


Омлет   (2011-09-23 15:19:00) [11]

> antonn ©   (23.09.11 12:28) [3]
> position:=0; нужно сделать перед всякими LoadFromStream()


Чушь. В данном случае как раз не надо, там не с начала битмап лежит.


antonn   (2011-09-23 15:07:00) [12]

там, где не нужно получить 'Bitmap image is not valid'


Ega23   (2011-09-23 14:48:00) [13]


> procedure TBitmap.LoadFromStream(Stream: TStream);
> begin
>  ReadStream(Stream, Stream.Size - Stream.Position);
> end;
>


Ну и где тут "надо" позишн в ноль ставить?


antonn   (2011-09-23 14:45:00) [14]

по крайней мере в Д7:

procedure TBitmap.LoadFromStream(Stream: TStream);
begin
 ReadStream(Stream, Stream.Size - Stream.Position);
end;


antonn   (2011-09-23 14:44:00) [15]

да, не перед "всякими", а image1.Picture.Bitmap.LoadFromStream() - надо


Ega23   (2011-09-23 14:36:00) [16]


> position:=0; нужно сделать перед всякими LoadFromStream()

Совершенно необязательно. Всё зависит от реализации "всяких LoadFromStream()"


Омлет   (2011-09-23 14:16:00) [17]

BitMapBuff вообще не нужен.


antonn   (2011-09-23 12:28:00) [18]

position:=0; нужно сделать перед всякими LoadFromStream()


ProgRAMmer Dimonych   (2011-09-23 11:54:00) [19]

А что за ошибка-то?


Плохиш   (2011-09-23 11:51:00) [20]

У TStream и соответственно его потоков имеется метод CopyFrom.


Наверх

Титульная страница Поиск, карта сайта Написать письмо