Форум: "Игры";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизФайлы в 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 вся ветка
Форум: "Игры";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.044 c