Форум: "Начинающим";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];
ВнизЗагрузить и выгрузить 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c