Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.01;
Скачать: CL | DM;

Вниз

Загрузить и выгрузить Bitmap из Stream   Найти похожие ветки 

 
Alex_C   (2011-09-23 11:46) [0]

Есть 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 вылетает ошибка...


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

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


 
ProgRAMmer Dimonych ©   (2011-09-23 11:54) [2]

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


 
antonn ©   (2011-09-23 12:28) [3]

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


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

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


 
Ega23 ©   (2011-09-23 14:36) [5]


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

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


 
antonn ©   (2011-09-23 14:44) [6]

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


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

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

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


 
Ega23 ©   (2011-09-23 14:48) [8]


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


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


 
antonn ©   (2011-09-23 15:07) [9]

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


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

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


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


 
antonn ©   (2011-09-23 15:26) [11]


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

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


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

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


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


 
stas ©   (2011-09-23 15:38) [13]

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


 
antonn ©   (2011-09-23 15:38) [14]

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

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


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


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

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


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

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

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


 
brother ©   (2011-09-24 07:20) [17]

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

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


 
brother ©   (2011-09-24 07:23) [18]

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

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


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

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


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


> BitMapStream.Position := 0;


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



Страницы: 1 вся ветка

Текущий архив: 2012.01.01;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
2-1316177245
Евгений07
2011-09-16 16:47
2012.01.01
Заброшенные сокеты


1-1278875240
dyonysos
2010-07-11 23:07
2012.01.01
MessageBox из TService


2-1316788939
Litt
2011-09-23 18:42
2012.01.01
CM_MOUSEENTER


2-1316800223
HF-Trade
2011-09-23 21:50
2012.01.01
Как узнать, позицию горизонтальной полосы прокрутки TListView


2-1316988773
Krema
2011-09-26 02:12
2012.01.01
Иероглифы в справке