Вниз
Скачать: CL | DM;

Файлы в GLMaterialLibrary из потока   Найти похожие ветки 

← →
Lambda   (2006-03-20 11:32) [0]

Интересует не загрузка целиком MaterialLibrary (GLScene), а загрузка например jpeg в МЛ. Т.е. по сути загрузить в GLMaterialLibrary...Image картинку из jpeg (bmp, tga...)


← →
Lambda   (2006-03-20 11:34) [1]

ЗЫ Загрузка именно из потока. LoadFromStream() не работает, даже не советуйте


← →
Lambda   (2006-03-20 13:11) [2]

Ого. Никто не знает? Или все упорно молчат :(


← →
Lambda   (2006-03-21 07:55) [3]

Хорошо, раз никто не знает ответа, то перефразирую вопрос: есть ли способ (ответа "есть" недостаточно) загрузить изображение из потока в bitmap, к примеру?


← →
Старик   (2006-03-21 08:09) [4]

Дай сюда нерабочий код загрузки с помощью LoadFromStream


← →
Lambda   (2006-03-21 09:03) [5]

Да какой там код...

BMP := TBitmap.Create;
BMP.LoadFromStream(MyStream);
GLMaterialLibrary.Materials.Add;
GLMaterialLibrary.Materials[0].Material.Texture.Image.Assign(BMP);
GLMaterialLibrary.Materials[0].Name := "test";
GLMaterialLibrary.Materials[0].Material.Texture.Disabled := False;
BMP.Free;

Результат: Bitmap image is not valid


← →
Lambda   (2006-03-21 10:25) [6]

Разумеется предварительно инициализируется поток

MyStream := TMemoryStream.Create;
MyStream.LoadFromFile("file.ext");


← →
DeadMeat ©   (2006-03-21 10:54) [7]

А после MyStream.LoadFromFile("file.ext");, ты делал MyStream.Position := 0; ??

---
...Death Is Only The Begining...


← →
Lambda   (2006-03-21 10:59) [8]

Не помогло :(


← →
DeadMeat ©   (2006-03-21 14:00) [9]

А GLMaterialLibrary.Materials[0].Material.Texture.NotifyChange (self); тоже не помогает?

---
...Death Is Only The Begining...


← →
DeadMeat ©   (2006-03-21 14:01) [10]

Опс.. Не в тему.
У тебя сообщение об ошибке же лезет?

---
...Death Is Only The Begining...


← →
DeadMeat ©   (2006-03-21 14:03) [11]

И если это так, то на какой строке именно вылетает?
На загрузке в битмап из потока или на присваивании материалу битмапа?

---
...Death Is Only The Begining...


← →
Домовенок ©   (2006-03-21 14:09) [12]

Я кстати тоже с этим не так давно мучался. Так и не разобрался. Но вот сейчас попробовал через TPicture, получилось. Это конечно не значит, что так и надо делать, но как информация к размышлению.


procedure TForm1.Button1Click(Sender: TObject);
var
 MS: TMemoryStream;
 BM: TBitmap;
 P: TPicture;
begin
 MS := TMemoryStream.Create;
 BM := TBitmap.Create;
 P := TPicture.Create;
 MS.LoadFromFile("test.bmp");
 BM.LoadFromStream(MS);
 P.Assign(BM);
 GLMaterialLibrary1.Materials.Add;
 GLMaterialLibrary1.Materials[0].Material.Texture.Image.Assign(P);
 GLMaterialLibrary1.Materials[0].Name := "test";
 GLMaterialLibrary1.Materials[0].Material.Texture.Disabled := False;
 MS.Free;
end;


← →
Lambda   (2006-03-21 15:01) [13]

0. Спасибо, Домовенок, попробую твой вариант
1. Ты забыл освободить P


← →
Старик   (2006-03-21 15:24) [14]

Lambda, я что-то не понял - почему именно мемори-стрим ?
Чем тебя не устраивает самый обычный TFileStream?

var s : TFileStream;
begin
s := TFileStream.Create(FileName.bmp, fmOpenRead or fmShareDenyWrite);
MyBmp := TBitmap.Create;
MyBmp.LoadFromStream(s);
s.Free;
//При таком подходе битмап грузится нормально.

GLMatLib1.Materials[0].Texture.Image.Assign(MyBmp);
//Другое дело, что тебе нужно уточнить, МОЖНО ЛИ к GLScene материалам делать вот такой вот ассигн. Может они этого не держат? (Я не спец в GLScene).
И потом, у меня иногда бывали странные ситуации с битмапами:
Битмапы, нарисованные в фотошопе, грузились идеально.
Битмапы, конвертированные из JPG с помощью айсидюхи, грузится отказывались.


← →
Домовенок ©   (2006-03-21 15:44) [15]

> Lambda   (21.03.06 15:01) [13]
1. Ты забыл освободить P


Угу, и BM тоже.

> Старик   (21.03.06 15:24) [14]
> Lambda, я что-то не понял - почему именно мемори-стрим ?
> Чем тебя не устраивает самый обычный TFileStream?


Судя по всему там проблема не в TMemoryStream, а именно в TBitMap, то есть в графическом формате, так как TPicture принимает нормально.


← →
Lambda   (2006-03-21 16:16) [16]


> Судя по всему там проблема не в TMemoryStream, а именно
> в TBitMap


Именно.
К сожалению, Домовенок, с TPicture тоже не прокатило.
Но может там какое-то мое упущение. Вечером тщательно проштудирую код.


← →
Lambda   (2006-03-21 17:04) [17]

Вношу ясность: пример Домовенка работает исключительно с форматом BMP, который меня никоим образом не устраивает. Хотелось бы чтобы читались хотя бы jpg.
Попытка сделать дополнительный assign (чем дельфи не шутит) в переменную типа TGPEGImage ни к чему не привела :(


← →
Старик   (2006-03-22 07:24) [18]

Значит, проблема именно в твоем файле, потому как мои фотошоповские файлы я легко подгружаю в Тбитмап и ассигную их куда захочу.
А JPeg я подгружаю так:
var bmp : TBitmap;
    jpg : TJPEGImage;
begin
jpg := TJPEGImage.Create;
JPG.LoadFromFile(FileName.jpg);
bmp := tbitmap.create;
bmp.width := jpg.width;
bmp.height := jpg.height;
bmp.assign(jpg);
jpg.free;
end;
все работает. только не забудь подключить модуль с определением jpg-ов.


← →
Lambda   (2006-03-22 07:52) [19]

Ты невнимательно прочитал вопрос.

> JPG.LoadFromFile(FileName.jpg);


читает из файла, а не из потока. Из файла я могу легко прочитать любой формат.


← →
Старик   (2006-03-22 08:25) [20]

var s : TFileStream;
begin
jpg := TJPEGImage.Create;
s := TFileStream.Create(FileName.jpg, fmOpenRead or fmShareDenyWrite);
Jpg.LoadFromStream(s);
s.Free;
bmp.Assign(jpg);
jpg.Free;


← →
Lambda   (2006-03-22 11:53) [21]

Похоже я все-таки недостаточно дал входных данных.
В общем, я работаю с hkStreams, т.е. чтение из потока происходит след. образом:

hkStreams1.GetStream("image.jpg", MyStream);
BMP := TBitmap.Create;
BMP.LoadFromStream(MyStream);

ну а дальше как у Домовенка.
В общем, Старик, твой метод не подходит :(
Есть еще идеи?


← →
Домовенок ©   (2006-03-22 12:39) [22]

Как вариант,
сохраняем:

GLMaterialLibrary1.SaveToStream(MS);
hkStreams1.AddStream("textures", MS);

и открываем:

hkStreams1.GetStream("textures", MS);
GLMaterialLibrary1.LoadFromStream(MS);


← →
Старик   (2006-03-22 12:44) [23]

ахм... а что есть hkStreams? Я о таком, вроде бы, не слышал...


← →
Домовенок ©   (2006-03-22 13:05) [24]

HKStreams is a component that enables you to easily save and load many streams into one file. The streams can be stored with LHA compression if wanted, and can also be encrypted with blowfish. THKStreams is also smart, if you load afterwards an encrypted or compressed (or both) file, it will know how to read it, and can also call your event that asks the user for a password if needed.Can also handle wrong passwords or corrupt files.

http://www.xarka.com/prog/delphi.html


← →
Lambda   (2006-03-22 13:10) [25]

Домовенок, все так, но дело в том, что тут все опять-таки упирается в формат читаемого из потока файла. Т.е. запись-то проходит без проблем, а прочитать и загрузить в МЛ возможности нет (либо приходится юзать предложенные тобой bmp"шки, что не есть хорошо для меня)

Старик, hkStreams  - компонент, позволяющий сохранять (ну и доставать само собой) множество потоков в один файл. Поддерживает компрессию и криптование. Классная вещь и до сих пор не было проблем. Но вот понадобилось хранить картинки в разных форматах и началось ... :(((


← →
DeadMeat ©   (2006-03-22 13:29) [26]


> hkStreams1.GetStream("image.jpg", MyStream);

А после этого позицию ставить на место? Не помогает? Просто с этими стримами я не работал.

---
...Death Is Only The Begining...


← →
Lambda   (2006-03-22 13:44) [27]

Нет, не помогает.
Пока единственный рабочий вариант - предложение Домовенка.
Но этот вариант плох по двум причинам: слишком велик размер конечного файла (рулят джипеги) и bmp (вроде бы) не позволяет работать с альфа-каналом (тут я предпочитаю dds или tga).

Целиком код загрузки выглядит следующим образом (несколько упрощен):

procedure TForm.Loader;
var
MyStream: TMemoryStream;
BM: TBitmap;
P: TPicture;
begin
hkStreams1 := ThkStreams.Create(Self);
hkStreams1.Compressed := True;
hkStreams1.Encrypted := True;
MyStream := TMemoryStream.Create;

hkStreams1.LoadFromFile("myfile.ext");
hkStreams1.GetStream("pic1.jpg", MyStream);

BM := TBitmap.Create;
P := TPicture.Create;

BM.LoadFromStream(MyStream);
P.Assign(BM);

GLMaterialLibrary1.Materials.Add;
GLMaterialLibrary1.Materials[0].Material.Texture.Image.Assign(P);
GLMaterialLibrary1.Materials[0].Name := "pic1.jpg";
GLMaterialLibrary1.Materials[0].Material.Texture.Disabled := False;

P.Free;
BM.Free;
MyStream.Free;
hkStreams1.Free;
end;


← →
Lambda   (2006-03-22 13:45) [28]

Вместо pic1.jpg читать pic1.bmp


← →
Старик   (2006-03-22 14:00) [29]

>>Но вот понадобилось хранить картинки в разных форматах и началось ... :(((
Тебе нужно хранить несколько картинок разных форматов в одном файле и при этом читать их потоками?
Если ты откажешься от ThkStreams, то никто тебе не запретит открыть один поток FileStream и в цикле скидывать в этот поток сколько угодно файлов какого угодно формата. Единственное, что ты теряешь, так это сжатие и криптование файла. А размер файла в таком случае будет равен сумме размеров всех файлов, которые ты писал потоком в конечный файл.


← →
Домовенок ©   (2006-03-22 14:13) [30]

У меня получилось так:


uses JPEG;
...

var
 MS: TMemoryStream;
 jpg: TJPEGImage;
begin
 MS := TMemoryStream.Create;
 MS.LoadFromFile("d:\test.jpg");
 MS.Position := 0;
 jpg := TJPEGImage.Create;
 jpg.LoadFromStream(MS);
 GLMaterialLibrary1.Materials.Add;
 GLMaterialLibrary1.Materials[0].Material.Texture.Image.Assign(jpg);
 GLMaterialLibrary1.Materials[0].Material.Texture.Disabled := False;
 GLMaterialLibrary1.Materials[0].Name := "test";
 GLCube1.Material.LibMaterialName := "test";
 MS.Free;
 jpg.Free;
end;


← →
Домовенок ©   (2006-03-22 14:19) [31]

Для .tga код аналогичный:


uses TGA;
...

var
 MS: TMemoryStream;
 tga: TTGAImage;
begin
 MS := TMemoryStream.Create;
 MS.LoadFromFile("d:\test.tga");
 MS.Position := 0;
 tga := TTGAImage.Create;
 tga.LoadFromStream(MS);
 GLMaterialLibrary1.Materials.Add;
 GLMaterialLibrary1.Materials[0].Material.Texture.Image.Assign(tga);
 GLMaterialLibrary1.Materials[0].Material.Texture.Disabled := False;
 GLMaterialLibrary1.Materials[0].Name := "test";
 GLCube1.Material.LibMaterialName := "test";
 tga.Free;
 MS.Free;
end;


ЗЫ: Судя по всему DeadMeat прав, проблема в позиции стрима после загрузки...


← →
Lambda   (2006-03-22 14:25) [32]

т.е. твой пример работает только при Position := 0 ?


← →
Домовенок ©   (2006-03-22 14:36) [33]

Если честно, не проверял, но я так понял ты тоже самое делал?
Или я ошибаюсь?

Попробуй сам убрать Position := 0;


← →
Lambda   (2006-03-22 14:45) [34]

Вопрос потерял актуальность. Все работает даже без указания позиции стрима


← →
Lambda   (2006-03-22 14:47) [35]

Всем спасибо, особенно Домовенку. Думаю мы оба извлекли пользу из моего поста ;) Код еще неотшлифован, но это уже дело техники :)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.54 MB
Время: 0.03 c
8-1149254008
djrevers
2006-06-02 17:13
2007.01.28
bass.pas


2-1168714403
Pasha L
2007-01-13 21:53
2007.01.28
Влияние позиции переменной в разделе var на работу программы


4-1158316591
R_O_O_T
2006-09-15 14:36
2007.01.28
помогите с SETUPAPI.dll )))


5-1147638855
Лев
2006-05-15 00:34
2007.01.28
Нужна компонента типа TMemo но с возможностью простейшего формата


15-1168465744
normandia
2007-01-11 00:49
2007.01.28
Впервые столкнулся с Win XP Home Edition. Плачевно.




   Наверх