Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
2-1168342189
VOPROS
2007-01-09 14:29
2007.01.28
Добавление записей через запрос из одной таблицы в другую


6-1156354343
anton773
2006-08-23 21:32
2007.01.28
Перехват закачки файла


15-1168014485
vidiv
2007-01-05 19:28
2007.01.28
Купил себе стиральную машину...


2-1168287682
Dim..ON
2007-01-08 23:21
2007.01.28
закрытие чужого приложения


2-1168593143
vigo_
2007-01-12 12:12
2007.01.28
Вызов переменной из другого Unit a





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский