RUS  ENG 

Получение картинки из потока

Страницы: 1
RSS
Получение картинки из потока
 
Здравствуйте.
Есть следующая проблема:
Сохраняю в поток фрагмен карты следующим образом:
IST:IStream;

MapCtrl1.Map.DrawToStream(w,h,x,y,s,2,IST);

Затем получаю его как картинку следющим образом:

OST:=TOleStream.Create(IST);
OST.Position:=0;
ST:=TMemoryStream.Create;
ST.LoadFromStream(OST);

Pict := TPicture.Create;
Pict.Bitmap.LoadFromStream(ST);

В этом месте вылетает ошибка: что-то вроде "Bitmap image is not valid"

Пишу под Delphi7, Zulu версии 6.0
Интересно, что под Zulu 5.2 все работает как часы.

Можете ли подсказать выход из ситуации
 
Проверил, правда на Visual C++. Работает.
После объявления IST:IStream перед подстановкой переменной в DrawToStream, нужно еще этот поток не только объявить, но и создать.
 
Да. Я его создаю.
таким образом:

CreateStreamOnHGlobal(0, TRUE, IST);

На Delphi все работает, если пользоваться компонентами версии 5.2
А на 6.0 все отваливается. В хелпе про это ни слова не написано.
 
А 5.2 и 6.0 на одной машине? Если да, то пятую нужно убрать и установить полную 6-ю.
Сейчас под рукой Delphi нет. Послезавтра можно проверить.
На С++ работает. Для проверки полученный поток скинул в файл:

void CDrawToSteramDlg::OnButton1()
{
IStream *Stream;

CreateStreamOnHGlobal( NULL, TRUE, &Stream);

if( Stream )
{
m_Map.GetMap().DrawToStream(300, 200, m_Map.GetMapX(), m_Map.GetMapY(), m_Map.GetMapScale(), 2, (IUnknown*)Stream);
LARGE_INTEGER li;
li.QuadPart = 0;
STATSTG st;
Stream->Seek(li, STREAM_SEEK_SET, NULL);
Stream->Stat(&st, STATFLAG_DEFAULT);
long size = (long)st.cbSize.QuadPart;
char *Ptr = (char*)calloc(size+1, 1);
Stream->Read( Ptr, size, NULL);
FILE* file = fopen( "d:\\file.gif", "wb" );
if( file )
{
fwrite( Ptr, size, 1, file );
fclose( file );
}
free(Ptr);
Stream->Release();
}
}
 
Похоже с ошибкой разобрался - в предыдущей версии картинка сохранялась и соответственно извлекалась из потока как битмар.
Я попробовал извлекать GIF, теперь все работает.

Но в извлеченном из потока файле изменяется фон рисунка. В Вашем примере ничего подобного не наблюдается?
 
Посмотрел. В GIF вродет фон прозрачны делает, в остальные форматы - белый. Почему так исторически делается, не помню. Опций никаких нет. Логичней отбражать фон тот же что и у карты в данный момент. Так и сделаю. Следите за обновлениями.
 
Большое спасибо за внимание.
А можно уточнить что значит "В GIF вродет фон прозрачны делает, в остальные форматы - белый"?

Возможно сохранение картинки в других форматах?
 
Шестой параметр в DrawToStream:
0 - BMP
1 - JPG
2 - GIF
4 - PNG
 
Спасибо большое за помощь. Вы очень помогли
 
У меня есть еще один вопрос. С вашего позволения я продолжу тему:
Вы не сталкивались с проблемой?
После вышеперечисленных операций создания и обработки потока

CreateStreamOnHGlobal(0, TRUE, IST);
MapCtrl1.Map.DrawToStream(w,h,x,y,s,2,IST);

OST:=TOleStream.Create(IST);
OST.Position:=0;
ST:=TMemoryStream.Create;
ST.LoadFromStream(OST);
...
Убиваю по очетреди все созданные потоки:
OST.Free;
ST.Free;
IST._Release;

Затем пытаюсь снова создать интерфейс
CreateStreamOnHGlobal(0, TRUE, IST);

Тут вылетает ошибка - типа нет привелегий.
и выйти из метода тоже не дает, видимо по той же причине.
Насколько могу судить комовский ресурс не освобождается...

Вы не знаете как можно с эти бороться?
 
Честно говоря, мы на Delphi не пишем. На С++ c такой проблемой не сталкивались.
 
Просто я думаю тут касяк в логике использования мной потоков.
Ведь функции создания и убивания IStream - API`шные
 
М.б. потому, что IST._Release вызывает метод Release() у интерфейса, но не инициализирует заново переменную нулем. Возможно, поможет IST := nil;
 
Попробовал, помогло )).Спасибо.
Страницы: 1