Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1316902702
Undria
2011-09-25 02:18
2012.01.01
Не работает код в Delphi XE2


4-1253673415
bzzz
2009-09-23 06:36
2012.01.01
Как программно получить путь до папки Application Data для пользо


15-1315701740
Думкин_
2011-09-11 04:42
2012.01.01
Игоря Шевченко, С Юбилеем!


4-1253602770
Brick
2009-09-22 10:59
2012.01.01
Сетевой каталог и сервис


15-1316032184
Юрий
2011-09-15 00:29
2012.01.01
С днем рождения ! 15 сентября 2011 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский