Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:22

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Textur aus DLL auslesen
BeitragVerfasst: Mo Aug 18, 2003 06:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Dez 09, 2002 11:45
Beiträge: 13
Wohnort: Garmisch - Partenkirchen
Wie kann man ein Bitmap oder ein JPG in eine DLL speichern und diese anschließend als Textur in OGL einbinden ? Gibts hierfür ein Tutorial ?

_________________
No pain, no gain


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 07:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Vielleicht als Resource in der DLL speichern und dann die Resource laden.
Wofür eigentlich?

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 08:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 10:00 
Offline
DGL Member
Benutzeravatar

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:
  1. TEX1  JPEG "Tex1.jpg"
  2. TEX2  BITMAP "Tex2.jpg"
  3. ...

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:
  1. var
  2.  DLLHandle : THandle;
  3.  Bitmap     : TBitmap;
  4. begin
  5. DLLHandle := Loadlibrary('MeineDLL.dll');
  6. Bitmap:=TBitmap.Create;
  7. Bitmap.LoadFromResourceName(DLLHandle, 'TEX2');
  8. ...
  9. Bitmap.Free;
  10. end;
  11.  


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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 20, 2003 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
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 ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 20, 2003 15:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
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? :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 20, 2003 15:41 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 21, 2003 06:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Dez 09, 2002 11:45
Beiträge: 13
Wohnort: Garmisch - Partenkirchen
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 ?

_________________
No pain, no gain


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 21, 2003 10:50 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 15, 2003 10:01 
Offline
DGL Member
Benutzeravatar

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 :oops:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 15, 2003 10:08 
Offline
DGL Member
Benutzeravatar

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 :oops:


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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 15, 2003 12:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2003 12:11 
Offline
DGL Member
Benutzeravatar

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:
  1. {$R *.DFM}

einfach
Code:
  1. {$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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2003 12:22 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Mal wieder Probs
BeitragVerfasst: Sa Sep 20, 2003 13:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
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:
  1. function TGLBMP.LoadImage(filename : String): Boolean;
  2. begin
  3.   Result := False;
  4.  
  5.   // If an image has already been loaded into memory, free it
  6.   ClearMem();
  7.  
  8.   // Check extension and load image using appropriate function
  9.   if (CompareText(ExtractFileExt(filename), '.bmp') = 0) then begin
  10.     Result := LoadBMP(filename);
  11.     Exit;
  12.   end;
  13.  
  14.   if (CompareText(ExtractFileExt(filename), '.jpg') = 0) then begin
  15.     Result := LoadJPG(filename);
  16.     Exit;
  17.   end;
  18.  
  19.   if (CompareText(ExtractFileExt(filename), '.tga') = 0) then begin
  20.     Result := LoadTGA(filename);
  21.     Exit;
  22.   end;
  23.  
  24.   if (CompareText(ExtractFileExt(filename), '.bzip') = 0) then begin
  25.     Result := LoadBzip(filename);
  26.     Exit;
  27.   end;
  28. end;
  29.  

Hier habe ich die Funktion zum Laden der bzip - Datei drangehängt.
Diese sieht folgendermassen aus :
Code:
  1. function TGLBMP.LoadBzip(compressed_file : string) : Boolean;
  2. var
  3.   fHeader : BITMAPFILEHEADER;   // Holds the file information for the bitmap
  4.   iHeader : BITMAPINFOHEADER;   // Holds the height, width, colordepth, etc..
  5.                                 // for the bitmap
  6.   palSize : Integer;            // size of the image's palette
  7.  
  8.   // used for loading from resource
  9.   ResStream : TMemoryStream;
  10.   InputStream : TFileStream;
  11.   DecompressionStream : TZDecompressionStream;
  12. begin
  13. if not fileexists(compressed_file) then
  14.         begin
  15.         result:=false;
  16.         exit;
  17.         end;
  18.   result:=true;
  19.   //Create Streams
  20.   ResStream:=TMemoryStream.Create;
  21.   InputStream:=TFileStream.Create(compressed_file, fmOpenRead);
  22.   DecompressionStream:=TZDecompressionStream.Create(InputStream);
  23.   //Load the image into the memory stream
  24.   ResStream.LoadFromStream(DecompressionStream);
  25.   //Free the other streams
  26.   InputStream.Free;
  27.   DecompressionStream.Free;
  28.   // Read in the bitmap file header
  29.   ResStream.ReadBuffer(fHeader, SizeOf(fHeader));
  30.  
  31.     // Check if its a windows bitmap by comparing its "magic number" to what
  32.     // the BMP specs say it should be
  33.     if fHeader.bfType <> BM then begin
  34.       Result := False;
  35.       ResStream.Free;
  36.       Exit;
  37.     end;
  38.     // Read in the bitmap info header
  39.     ResStream.ReadBuffer(iHeader, SizeOf(iHeader));
  40.  
  41.     // Make sure that the image doesn't use a bitmap core header (not supported)
  42.     if iHeader.biSize = SizeOf(BITMAPCOREHEADER) then begin
  43.       Result := False;
  44.       ResStream.Free;
  45.       Exit;
  46.     end;
  47.  
  48.     // Set the bitmaps width, height, and colordepth to the bitmap
  49.     // being loaded's values
  50.     Width := iHeader.biWidth;
  51.     Height := Abs(iHeader.biHeight);
  52.     ColorDepth := iHeader.biBitCount;
  53.  
  54.     // Check for compression or lack thereof
  55.     if iHeader.biCompression <> BI_RGB then begin
  56.       if iHeader.biCompression = BI_BITFIELDS then begin
  57.         // Read in the red, blue, and green bitmasks, later used to
  58.         // decode the 16bpp image's color information
  59.         if ColorDepth = 16 then begin
  60.           ResStream.ReadBuffer(palette.redMask, SizeOf(Dword));
  61.           ResStream.ReadBuffer(palette.greenMask, SizeOf(Dword));
  62.           ResStream.ReadBuffer(palette.blueMask, SizeOf(Dword));
  63.         end;
  64.       end else begin
  65.         // RLE compression is unsupported so exit
  66.         Result := False;
  67.         ResStream.Free;
  68.         Exit;
  69.       end;
  70.     end;
  71.  
  72.     // Read in the images palette if its required (8 and 4bpp images)
  73.     if ColorDepth < 16 then begin
  74.       // Size of palette in bytes
  75.       palSize := iHeader.biClrUsed*4;
  76.  
  77.       // Read in the palette
  78.       ResStream.ReadBuffer(palette.Colors, palSize);
  79.       {if bytesRead <> palSize then begin
  80.         Result := False;
  81.         ResStream.Free;
  82.         Exit;
  83.       end;}
  84.     end;
  85.     // Jump to the bitmaps bits
  86.     ResStream.seek(fHeader.bfOffBits, soFromBeginning);
  87.  
  88.     // Get the size of the image (in bytes)
  89.     imageSize := iHeader.biSizeImage;
  90.  
  91.     // Some images have this set to zero so if they do, manually calculate it
  92.     if imageSize = 0 then begin
  93.       imageSize := Height * GetLineWidth(ColorDepth);
  94.     end;
  95.  
  96.     // Load the images pixel data depending on the color depth of the image
  97.     case ColorDepth of
  98.       32 : Load32bzip(ResStream);
  99.       {24 : Load24(@bmpFile);
  100.       16 : Load16(@bmpFile);
  101.       8 : Load8(@bmpFile);
  102.       4 : Load4(@bmpFile);}
  103.       else Result := False;
  104.     end;
  105.     // Check to see if image was loaded
  106.     if not Assigned(rgbBits) then begin
  107.       Result := False;
  108.       ResStream.Free;      
  109.       Exit;
  110.     end;
  111.  
  112.     // Set the alpha channel of the image to completely opaque
  113.     SetAlpha(255);
  114.     //Free memory stream
  115.     ResStream.Free;
  116. end;
  117.  

Und die Funktion Load32bzip(ResStream : TStream) sieht so aus :
Code:
  1. procedure TGLBMP.Load32bzip(ResStream: TStream);
  2. var
  3.   bytesRead : Integer;  // Used in read operations to check for errors
  4.   size : Integer;
  5. begin
  6.   size := Width*Height*4;
  7.  
  8.   // Allocate enough memory to hold the BGR image
  9.   GetMem(rgbBits, size);
  10.  
  11.   // Read in the bitmaps color bytes
  12.   ResStream.ReadBuffer(rgbBits^, size);
  13.  
  14.   SwapRB();
  15. end;
  16.  


Mein Problem ist im Moment das Auslesen der Bitmap - Daten, denn der Code
Code:
  1. // Read in the bitmaps color bytes
  2.   ResStream.ReadBuffer(rgbBits^, size);
funktioniert leider nicht, da
Code:
  1. // Check to see if image was loaded
  2.     if not Assigned(rgbBits) then begin
  3.       Result := False;
  4.       ResStream.Free;      
  5.       Exit;
  6.     end;
  7.  
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.021s | 16 Queries | GZIP : On ]