![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузить и выгрузить 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.