Soweit ich weiß kann man ans Ende jeder Ausführbaren Datei(und damit müßte es auch mit dll's gehen) beliebig viele Daten einfach anhängen.
Obwohl ich mich auch frage, wozu?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Du musst deine Dateien (im Fachjargon Resourcen genannt) erstmal mit Hilfe des Borland Resource Compiler (Im Bin-Verzeichnis von Delphi unter dem Namen brcc32.exe) in eine Resourcendatei kompilieren.Dazu schreibst du dir im Notepad ein Skript, in dem die Namen und Typen der zu kompilierenden Resourcen drinstehen.Das sieht dann z.B. so aus :
Code:
TEX1 JPEG "Tex1.jpg"
TEX2 BITMAP "Tex2.jpg"
...
Danach jagst du dieses Skript in der Kommandozeile durch den BRC (brcc32 MeinSkript.RC) und schon hast du eine RES-Datei, die du über die $R-Kompilerdirektive in deine DLL (oder EXE) einbinden kannst ({$R MeineResource.RES}), und schon werden die Resourcen in die EXE bzw. DLL mithineinkopiert. Wenn du deine Resourcen nun aus der externen DLL laden willst, dann geht das für ein Bitmap z.b. folgendermaßen :
Code:
var
DLLHandle : THandle;
Bitmap : TBitmap;
begin
DLLHandle := Loadlibrary('MeineDLL.dll');
Bitmap:=TBitmap.Create;
Bitmap.LoadFromResourceName(DLLHandle, 'TEX2');
...
Bitmap.Free;
end;
P.S. : Wenn du Zugriff auf den Borland Resource Workshop hast (dürfte beim C-Builder dabei sein), dann geht das Erstellen von Resourcendateien mit dieser dafür gemachten GUI etwas schneller von der Hand.
Ich hab das ganze hier auch mal durchgewurschtelt und es durch abschreiben aus der Textures.pas geschaft, ein JPEG umzudrehen, die Farben zu vertauschen und in ein Bitmap zu popeln. Nur wie man einen TGLUInt diesem Bitmap zuweist bzw. drauf Pointert und mittels glBindTexture dieses dann auch als Textur verwendet, dass hab ich diesmal auch mit Hilfe der Textures.pas nicht geschnallt. Kann mir jemand einen Codeschnipsel vorgeben, damit ich es gefressen habe ? (Also wie verwende ich ein speicherresistentes Bitmap als Textur ?)
Des weiteren Frage ich mich, ob es eine sinnvolle Methode ist, seine Texturen in eine DLL zu packen und dann auszulesen. Was onkeltorty wahrscheinlich wollte, ist, dass keiner seine Texturen auf anhieb auslesen kann. Wie würdet ihr sowas bewerkstelligen ? Kompression mit Kryptographie ?
Verhindern das jemand auf die Texturen Zugreifen kann geht nur indem man sie mit einem eigenen Algorithmus verschlüsselt. Ist nicht wirklich kompliziert. Jedoch sollte man sich fragen ob man das wirklich braucht?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ein TBitmap kannst du gar nicht als Textur benutzen. Du brauchst einen unabhängigen Speicherbereich in dem sich die Bilddaten befinden (nur der Inhalt).
Allerdings habe ich mir die ganze mühe schon mal gemacht und das hoffentlich recht sauber in einer Klassenstruktur abgelegt. Schau dir mal folgenden Thread und Unit an.
http://www.delphigl.com/forum/viewtopic.php?t=1530
Damit ist es auch möglich Texturen aus Resourcen zu laden.
Und wenn du deine Texturen vor anderen Usern verstecken möchstest empfielt es sich einen Packer zu verwenden. (bzip) Oder du scheibst dir selber ein Format in denen du deine Dateien hälst. Aber ein Packalgorythmus ist dort besser, da der weniger arbeit kostet und die Dateien auch "verschlüsselt" werden. Eine DLL wäre da fehl am Platze, weil diese Nämlich von Windows in den Speicher geladen wird. Was bei vielen Texturen recht Unsinnig ist.
Texturen aus einer Resource zu laden ist ja auch mit der Textures.pas möglich. Wenn man das ganze also in eine komprimierte Datei legen würde, welchen Packalgorithmus müsste man verwenden, um die Texturen auch zur Laufzeit aus der komprimierten Datei auszulesen ? Aus einer komprimierten Zip die Texturen erst zu entpacken und anschliessend zu lesen ist eher witzlos. Geht das vielleicht mit dem CAB-Format oder so ? Kennt jemand ein Tutorial, welches beschreibt, wie man aus einer komprimierten Datei zur Laufzeit lesen kann ?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Schau mal hier : http://www.torry.net/compresscustom.htm , dort gibt es ne Library namens Delphi Fast ZLib, die auf ZLib basiert (ohne DLL) und Dateien in einen Stream entpacken kann, also in den Hauptspeicher.Das dürfte genau das sein was du brauchst.
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Zitat:
die du über die $R-Kompilerdirektive in deine DLL (oder EXE) einbinden kannst ({$R MeineResource.RES}), und schon werden die Resourcen in die EXE bzw. DLL mithineinkopiert.
Ähm... kann mir bitte jemand erklären, wie ich das konkret progge, ich bekomms einfach nicht hin Vielen Dank
La_Boda
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
La_Boda hat geschrieben:
Ähm... kann mir bitte jemand erklären, wie ich das konkret progge, ich bekomms einfach nicht hin
Da gibts eigentlich nicht viel zu proggen.Du erstellst deine Resource (entweder mit ner GUI wie dem ResourceWorkshop oder dem Kommandozeilen Resourcenkompiler) und bindest diese dann über die $R-Kompilerdirektive in dein Programm ein. Dadurch werden alle in der angegebenen Resourcendatei erwähnten Resourcen in deine EXE (oder DLL) mitgelinkt.
Über entsprechende Funktionen wie z.B. LoadTextures (Jan Horn's Unit) oder LoadFromResourceID (Methode von TBitmap) kannst du dann z.B. in die EXE gelinkte Texturen direkt laden, und wenn du andere Datentypen laden willst, dann geht das recht bequem über den TResourceStream.
Wenn Du die Daten selber komprimieren und dekomprimieren willst, dann schau Dir mal den TCompressedStream an. Der arbeitet mit ZLib und braucht unter Windows keine zusätzlichen DLLs. Unter Linux wird dir libz.so.1, die bei jeder distribution dabei sein müsste. Der CompressedStream ist in der unit ZLib.pas definiert, welche (zumindest bei Delphi 7) dabei ist.
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Probleme macht mir vor allem diese $-Kompilerdirektive, muss ich denn dann im Quellcode nach dem
Code:
{$R *.DFM}
einfach
Code:
{$R MeinScript.res}
einfügen, oder was?
Kann ich das bei einer DLL genauso machen?
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ja, so gehts.Und es spielt auch keine Rolle ob du die Resource in eine DLL oder in eine EXE einbindest.
P.S. : Besonders wenn du größere Resourcendateien in deine EXE oder DLL hineinlinken willst, würde ich das erst implementieren wenn dein Projekt kurz vor der Vollendung steht, denn ansonsten werden die Resourcen bei jedem Kompiliervorgang gelinkt, was sehr lange dauern kann.
Ich hab mich hingehockt und wollte die glBmp.pas von Jason Allen so modifizieren, dass man mit Ihr auch Texturen aus einer *.zlib - Datei auslesen kann. Dabei habe ich folgende Modifikationen gemacht :
Code:
function TGLBMP.LoadImage(filename : String): Boolean;
begin
Result := False;
// If an image has already been loaded into memory, free it
ClearMem();
// Check extension and load image using appropriate function
if (CompareText(ExtractFileExt(filename), '.bmp') = 0) then begin
Result := LoadBMP(filename);
Exit;
end;
if (CompareText(ExtractFileExt(filename), '.jpg') = 0) then begin
Result := LoadJPG(filename);
Exit;
end;
if (CompareText(ExtractFileExt(filename), '.tga') = 0) then begin
Result := LoadTGA(filename);
Exit;
end;
if (CompareText(ExtractFileExt(filename), '.bzip') = 0) then begin
Result := LoadBzip(filename);
Exit;
end;
end;
Hier habe ich die Funktion zum Laden der bzip - Datei drangehängt. Diese sieht folgendermassen aus :
Code:
function TGLBMP.LoadBzip(compressed_file : string) : Boolean;
var
fHeader : BITMAPFILEHEADER; // Holds the file information for the bitmap
iHeader : BITMAPINFOHEADER; // Holds the height, width, colordepth, etc..
// Some images have this set to zero so if they do, manually calculate it
if imageSize = 0 then begin
imageSize := Height * GetLineWidth(ColorDepth);
end;
// Load the images pixel data depending on the color depth of the image
case ColorDepth of
32 : Load32bzip(ResStream);
{24 : Load24(@bmpFile);
16 : Load16(@bmpFile);
8 : Load8(@bmpFile);
4 : Load4(@bmpFile);}
else Result := False;
end;
// Check to see if image was loaded
if not Assigned(rgbBits) then begin
Result := False;
ResStream.Free;
Exit;
end;
// Set the alpha channel of the image to completely opaque
SetAlpha(255);
//Free memory stream
ResStream.Free;
end;
Und die Funktion Load32bzip(ResStream : TStream) sieht so aus :
Code:
procedure TGLBMP.Load32bzip(ResStream: TStream);
var
bytesRead : Integer; // Used in read operations to check for errors
size : Integer;
begin
size := Width*Height*4;
// Allocate enough memory to hold the BGR image
GetMem(rgbBits, size);
// Read in the bitmaps color bytes
ResStream.ReadBuffer(rgbBits^, size);
SwapRB();
end;
Mein Problem ist im Moment das Auslesen der Bitmap - Daten, denn der Code
Code:
// Read in the bitmaps color bytes
ResStream.ReadBuffer(rgbBits^, size);
funktioniert leider nicht, da
Code:
// Check to see if image was loaded
if not Assigned(rgbBits) then begin
Result := False;
ResStream.Free;
Exit;
end;
als Antwort FALSE zurückgibt. Der Fehler liegt irgendwo innerhalb von Load32Bzip ... nur leider komm ich im Moment nicht drauf, da ich nicht sehr viel Erfahrung mit Streams und Bitmapdaten habe. Sieht jemand den Fehler ? Ich habe die modifizierte Pas mit drangeheftet. Ich benötige nur eine Lösung für 32 bit Bitmaps. Was anderes verwende ich sowieso nicht.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.