Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 9
1

TStream в IStream

23.02.2015, 21:51. Показов 7230. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Столкнулся с проблемой преобразования TStream в IStream. Использую такой код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
              
var
 out_img: TGPImage;
 Stream: TMemoryStream;
 aptr: IStream;
 n: Int64;
 Bit: TBitMap;
 COMStream: IStream;
begin
Stream:= TMemoryStream.Create ();
GetEncoderClsid('image/bmp', encoderClsid);
aptr:= TStreamAdapter.Create(Stream, soReference) as IStream;
out_img.Save (aptr, encoderClsid);
 aptr.Seek(0, 0, n);//Сдвигаем указатель потока в начало.
 
Bit:= TBitMap.Create ();
 
Bit:= LaplaceFilter ();
 
Bit.SaveToStream(Stream);
 
COMStream := TStreamAdapter.Create(Stream, soReference);
 
COMStream.Seek(0, 0, n);
 
out_img.FromStream(COMStream);
out_img.Save('11.bmp', encoderClsid) ;
end;
Но сохраняется изображение с черным фоном. Как это исправить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2015, 21:51
Ответы с готовыми решениями:

Разница между istream::putback и istream::unget
Можете объяснить, пожалуйста, разницу этих двух функций?

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &)
Добрый день. Как осуществляется выделения памяти под перегруженный оператор ввода данных в...

Parse_matrix(std::istream& in); std::istream& in что это значит?
Есть функция которую необходимо описать: std::pair<int, int> parse_matrix(std::istream& in){ ...

TStream
Добрый день народ! У меня возникла проблема с потоками TMemoryStream. Подскажите пожалуйста как...

20
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.02.2015, 08:20 2
а что это за свистопляка - одновременное обращение к стриму как к объекту и как к интерфейсу ?

out_img.Save (aptr, encoderClsid); // здесь обращение к интерфейсу
Bit.SaveToStream(Stream); // а здесь к объекту

что ты хотел этим добиться ?
0
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 9
24.02.2015, 18:18  [ТС] 3
mss,

Тут нужно сохранить изображение в поток для дальнейшего преобразования.

Delphi
1
2
aptr:= TStreamAdapter.Create(Stream, soReference) as IStream;
out_img.Save (aptr, encoderClsid);
Тут преобразовали:

Delphi
1
Bit:= LaplaceFilter ();
И далее необходимо сохранить Bit обратно в out_img. Так что я делаю не так?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.02.2015, 19:35 4
Bit:= TBitMap.Create (); // вот ты создал объект-битмап и присвоил переменной Bit ссылку на него
Bit:= LaplaceFilter (); // а здесь ты ты что творишь ?

Цитата Сообщение от Alex917 Посмотреть сообщение
Тут преобразовали
Кого во что преобразовали ?
1
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 9
24.02.2015, 20:02  [ТС] 5
mss, LaplaceFilter - это фильтр для изображения

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function LaplaceFilter():TBitMap;
var
ray : array [0..8] of integer;
OrigBMP: TBitmap;
z : word;
begin
OrigBMP := TBitmap.Create;  // Copy image to 24-bit bitmap
CopyMe(OrigBMP, WindowImage.Picture.Graphic);
ray[0] := -1; ray[1] := -1; ray[2] := -1;
ray[3] := -1; ray[4] :=  8; ray[5] := -1;
ray[6] := -1; ray[7] := -1; ray[8] := -1;
 
z:= 1;
 
case ComboBox.ItemIndex of
  0 : ConvolveM(ray,z,OrigBMP);
  1 : ConvolveE(ray,z,OrigBMP);
  2 : ConvolveI(ray,z,OrigBMP);
end;
 
Result:= OrigBMP;
 
end;
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.02.2015, 20:04 6
Цитата Сообщение от Alex917 Посмотреть сообщение
это фильтр для изображения
А нафига тогда до вызова LaplaceFilter() ты создаешь битмап ?
0
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 9
24.02.2015, 20:06  [ТС] 7
mss, а каким образом я передам битмап в out_img?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.02.2015, 20:13 8
Нет, сначала ты включи голову и попытайся ответить на вопрос)

До вызова LaplaceFilter() ты создаешь битмап и во время вызова ты создаешь еще один битмап.

Простой вопрос : какой из этих двух битмапов попадет в переменную Bit и что при этом произойдет с другим ?
0
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 9
24.02.2015, 20:19  [ТС] 9
mss, хорошо, допустим будет вот такая процедура.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure LaplaceFilter(var m: TBitMap);
var
ray : array [0..8] of integer;
OrigBMP: TBitmap;
z : word;
begin
m := TBitmap.Create;  // Copy image to 24-bit bitmap
CopyMe(m, WindowImage.Picture.Graphic);
ray[0] := -1; ray[1] := -1; ray[2] := -1;
ray[3] := -1; ray[4] :=  8; ray[5] := -1;
ray[6] := -1; ray[7] := -1; ray[8] := -1;
 
z:= 1;
 
case ComboBox.ItemIndex of
  0 : ConvolveM(ray,z,OrigBMP);
  1 : ConvolveE(ray,z,OrigBMP);
  2 : ConvolveI(ray,z,OrigBMP);
end;
 
end;
И вызов соответственно:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var
 out_img: TGPImage;
 Stream: TMemoryStream;
 aptr: IStream;
 n: Int64;
 Bit: TBitMap;
 COMStream: IStream;
begin
Stream:= TMemoryStream.Create ();
GetEncoderClsid('image/bmp', encoderClsid);
aptr:= TStreamAdapter.Create(Stream, soReference) as IStream;
out_img.Save (aptr, encoderClsid);
 aptr.Seek(0, 0, n);//Сдвигаем указатель потока в начало.
 
 
LaplaceFilter (Bit);
 
Bit.SaveToStream(Stream);
 
COMStream := TStreamAdapter.Create(Stream, soReference);
 
COMStream.Seek(0, 0, n);
 
out_img.FromStream(COMStream);
out_img.Save('11.bmp', encoderClsid) ;
end;
Но от этого ничего не меняется...
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.02.2015, 20:26 10
Цитата Сообщение от Alex917 Посмотреть сообщение
от этого ничего не меняется
Кое-что да меняется - не теряется в памяти один бестолково созданный объект)

Ткперь вместо
Bit.SaveToStream(Stream);

запиши битмап в файл
Bit.SaveToFile('MyFile.bmp')

Затем открой созданный файл любым просмотрщиком граф.файлов и убедись что ф-ция налапласила то что тобой ожидалось)
0
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 9
24.02.2015, 20:28  [ТС] 11
mss, мне необходимо передать его в out_img...
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.02.2015, 21:26 12
прежде чем передавать убедись в том что есть что передавать
0
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 9
25.02.2015, 14:21  [ТС] 13
mss, если сохранять из Stream, то изображение сохраняется корректно:

Delphi
1
Stream.SaveToFile('test.bmp');
А если Stream передавать в COMStream, то сохраняется изображение с черным фоном:

Delphi
1
2
3
4
5
6
              
COMStream := TStreamAdapter.Create(Stream, soReference);
Stream.SaveToFile ('1111.bmp');
COMStream.Seek(0, 0, n);
out_img.FromStream(COMStream);
out_img.Save('11.bmp', encoderClsid);
Как это исправить?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.02.2015, 14:28 14
Вероятно объект out_img не понимает формат изображения, читаемого из стрима

GetEncoderClsid('image/bmp', encoderClsid); // это вот ты кому и как скомандовал ?
0
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 9
25.02.2015, 16:46  [ТС] 15
mss,
Указываем в каком формате необходимо будет сохранить изображение, в нашем случае это - BMP.
Delphi
1
GetEncoderClsid('image/bmp', encoderClsid);
А тут указываем encoderClsid, который говорит, что нужно сохранить изображение в BMP:

Delphi
1
out_img.Save('11.bmp', encoderClsid);
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.02.2015, 21:36 16
Я разве спрашивал тебя про сохранение ?
Чтение !
Откуда объект out_img узнает что содержимое читаемого им потока должно им трактоваться как битмап ?
Если по сигнатуре, то не факт что он это умеет...
0
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 9
25.02.2015, 22:44  [ТС] 17
mss, и как тогда передать изображение?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.02.2015, 08:26 18
почитать внимательно документацию к TGPImage
0
15 / 1 / 0
Регистрация: 04.05.2015
Сообщений: 19
12.09.2017, 14:24 19
итого к чему пришли?
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,130
Записей в блоге: 3
12.09.2017, 14:31 20
Цитата Сообщение от хренотень Посмотреть сообщение
итого к чему пришли?
к этому
Alex917, Последняя активность: 26.03.2015 11:20
mss, Последняя активность: 04.01.2017 16:53
0
12.09.2017, 14:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2017, 14:31
Помогаю со студенческими работами здесь

TStream
Кто что знает, о этом чудо-юде, прошу разъяснить как с этим работать, желательно на небольшом...

INI + TStream
Сохраняю фильтр cxGrid1TableView1 в INI-файл: TStream *AStream = new TMemoryStream();...

потоки (TStream)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Прочитать данные из TStream
здравствуйте, я практически сломал голову (((( пишу код на С++...Все работает, переношу на free...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru