![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Файлы в GLMaterialLibrary из потока [Delphi, Windows]
Lambda © (2006-03-20 11:32:00)Интересует не загрузка целиком MaterialLibrary (GLScene), а загрузка например jpeg в МЛ. Т.е. по сути загрузить в GLMaterialLibrary...Image картинку из jpeg (bmp, tga...)
Lambda (2006-03-22 14:47:00) [1]Всем спасибо, особенно Домовенку. Думаю мы оба извлекли пользу из моего поста ;) Код еще неотшлифован, но это уже дело техники :)
Lambda (2006-03-22 14:45:00) [2]Вопрос потерял актуальность. Все работает даже без указания позиции стрима
Домовенок (2006-03-22 14:36:00) [3]Если честно, не проверял, но я так понял ты тоже самое делал?
Или я ошибаюсь?
Попробуй сам убрать Position := 0;
Lambda (2006-03-22 14:25:00) [4]т.е. твой пример работает только при Position := 0 ?
Домовенок (2006-03-22 14:19:00) [5]Для .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прав, проблема в позиции стрима после загрузки...
Домовенок (2006-03-22 14:13:00) [6]У меня получилось так:
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:00:00) [7]>>Но вот понадобилось хранить картинки в разных форматах и началось ... :(((
Тебе нужно хранить несколько картинок разных форматов в одном файле и при этом читать их потоками?
Если ты откажешься от ThkStreams, то никто тебе не запретит открыть один поток FileStream и в цикле скидывать в этот поток сколько угодно файлов какого угодно формата. Единственное, что ты теряешь, так это сжатие и криптование файла. А размер файла в таком случае будет равен сумме размеров всех файлов, которые ты писал потоком в конечный файл.
Lambda (2006-03-22 13:45:00) [8]Вместо pic1.jpg читать pic1.bmp
Lambda (2006-03-22 13:44:00) [9]Нет, не помогает.
Пока единственный рабочий вариант - предложение Домовенка.
Но этот вариант плох по двум причинам: слишком велик размер конечного файла (рулят джипеги) и 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;
DeadMeat (2006-03-22 13:29:00) [10]
> hkStreams1.GetStream('image.jpg', MyStream);
А после этого позицию ставить на место? Не помогает? Просто с этими стримами я не работал.
---
...Death Is Only The Begining...
Lambda (2006-03-22 13:10:00) [11]Домовенок, все так, но дело в том, что тут все опять-таки упирается в формат читаемого из потока файла. Т.е. запись-то проходит без проблем, а прочитать и загрузить в МЛ возможности нет (либо приходится юзать предложенные тобой bmp'шки, что не есть хорошо для меня)
Старик, hkStreams - компонент, позволяющий сохранять (ну и доставать само собой) множество потоков в один файл. Поддерживает компрессию и криптование. Классная вещь и до сих пор не было проблем. Но вот понадобилось хранить картинки в разных форматах и началось ... :(((
Домовенок (2006-03-22 13:05:00) [12]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
Старик (2006-03-22 12:44:00) [13]ахм... а что есть hkStreams? Я о таком, вроде бы, не слышал...
Домовенок (2006-03-22 12:39:00) [14]Как вариант,
сохраняем:
GLMaterialLibrary1.SaveToStream(MS);
hkStreams1.AddStream('textures', MS);
и открываем:
hkStreams1.GetStream('textures', MS);
GLMaterialLibrary1.LoadFromStream(MS);
Lambda (2006-03-22 11:53:00) [15]Похоже я все-таки недостаточно дал входных данных.
В общем, я работаю с hkStreams, т.е. чтение из потока происходит след. образом:
hkStreams1.GetStream('image.jpg', MyStream);
BMP := TBitmap.Create;
BMP.LoadFromStream(MyStream);
ну а дальше как у Домовенка.
В общем, Старик, твой метод не подходит :(
Есть еще идеи?
Старик (2006-03-22 08:25:00) [16]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 07:52:00) [17]Ты невнимательно прочитал вопрос.
> JPG.LoadFromFile(FileName.jpg);
читает из файла, а не из потока. Из файла я могу легко прочитать любой формат.
Старик (2006-03-22 07:24:00) [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-21 17:04:00) [19]Вношу ясность: пример Домовенка работает исключительно с форматом BMP, который меня никоим образом не устраивает. Хотелось бы чтобы читались хотя бы jpg.
Попытка сделать дополнительный assign (чем дельфи не шутит) в переменную типа TGPEGImage ни к чему не привела :(
Lambda (2006-03-21 16:16:00) [20]
> Судя по всему там проблема не в TMemoryStream, а именно
> в TBitMap
Именно.
К сожалению, Домовенок, с TPicture тоже не прокатило.
Но может там какое-то мое упущение. Вечером тщательно проштудирую код.