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

Aktuelle Zeit: So Jul 06, 2025 19:22

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 11, 2003 16:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 07, 2003 15:25
Beiträge: 77
Gibt es eine Möglichkeit Heightmap Daten aus einer Bmap auszulesen, ohne irgendwelche anderen Units außer die Opengl.pas zu verwenden ?

_________________
Wer Ordnung hält, ist zu faul zum Suchen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 11, 2003 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ja...du lädst deine Heightmap in ein ganz normales TBitmap, und dort kannst du die Farbwerte der Bildpunkte des Bitmaps doch ganz einfach über die Eigenschaft TBitmap.Canvas.Pixels (=Array of Array of TColor) auslesen.Dazu benötigst du nur die mit Delphi gelieferte Unit, in der TBitmap deklariert ist (Graphics).

Diese Farbwerte im Canvas.Pixels-Array musst du dann nur noch durch den Farbwert clWhite dividieren, und schon hast du deine Höhenwerte (sofern du ein Graustufenbitmap verwendest)...ich wüsste jetzt eigentlich auch gar nicht wie man das anders machen würde.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 11, 2003 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
Son of Satan hat geschrieben:
Diese Farbwerte im Canvas.Pixels-Array musst du dann nur noch durch den Farbwert clWhite dividieren, und schon hast du deine Höhenwerte (sofern du ein Graustufenbitmap verwendest)...ich wüsste jetzt eigentlich auch gar nicht wie man das anders machen würde.

da ich das so irgendwie nie hinbekommen habe und es auch schwachsinnig fand ein grayscale Bild farbig auszulesen hab ich es auch etwas anders gemacht, das Zauberwort heißt Scanline. Dummerweise in C++, aber die VCL sollte ja ungefähr die gleiche sein...

Es schadet ja hoffentlich trotzdem nicht, den Code hier zu posten:
Code:
  1.  
  2. Byte *ptr,*all;  //zwei byte zeiger, entspricht nem char von der Größe
  3.  
  4. //das "->" entspricht dem "." bei Delphi
  5. all=new Byte[ Image1->Picture->Width * Image1->Picture->Height ];     //es wird dynamisch Pixelanzahl Byte Speicher reserviert
  6.  
  7.  for ( int i = 0; i < Image1->Picture->Height; i++ ) &nbsp; &nbsp; &nbsp;//Für alle Zeilen
  8.      { &nbsp; &nbsp; //entspricht dem Begin
  9.           ptr = (Byte *) Image1->Picture->Bitmap->ScanLine[ i ]; &nbsp; &nbsp; //Lese die Zeile und gib die Adresse der Werte an den zeiger ptr
  10.           for ( int j = 0; j < Image1->Picture->Width; j++) &nbsp; &nbsp; //Für alle Pixel  der Zeile
  11.               all[ i * Image1->Picture->Width + j ]=ptr[ j ]; &nbsp; &nbsp; &nbsp;//schreibe das entsprechende Pixel der Zeile in das Heightfield array
  12.      } &nbsp; &nbsp;// entspricht dem End
  13.  

Das // ist das Kommentarzeichen von C und auch PHP. Sorry, dass das jetzt in C++ ist... aber ich weiß gerade nicht mehr wie Zeiger in Delphi gehen und teilweise umsetzten ist dann auch blöd.
Ich glaube in der Dokumentation gibts nen gutes Beispiel zu Scanline, das fast genauso ist. Ich ahb leider gerade nur kein Delphi zur Hand um nachzuschauen. Vieleicht kann ich den Delphi Code noch nachliefern... oder jemand von den anderen, wenns überhaupt jemanden interessiert B)

MfG
Mindwalker

[Edit] Wie man vieleicht sieht, hab ich aus bequemlichkeit einfach ne bestehende Image Komponente genommen, der Code zum Laden sieht so aus
Image1.Picture.LoadFromFile(OpenDialog1.FileName);
Man kann das natürlich auch ohne OpenDialog machen.
[/Edit]

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 11, 2003 17:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Will dir ja nicht vor den Kopf stossen, aber was ist an der Nutzung von Scanlines zum Laden seiner Höhendaten für die Heightmap so toll...die Lösung ist nicht nur umständlich, sondern bringt ggü. der Nutzung des Pixelarrays des TCanvas eines Bitmaps doch absolut keine Vorteile...

Dies ist der Code wie ich ihn (ungefähr) meinte, und der sieht nicht nur unkomplizierter aus, sondern macht auch genau dasselbe :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>for</span> x := <span class='integer'>0</span> <span class='reserved'>to</span> Bmp.Width-<span class='integer'>1</span> <span class='reserved'>do</span>
<span class='reserved'>for</span> y := <span class='integer'>0</span> <span class='reserved'>to</span> Bmp.Height-<span class='integer'>1</span> <span class='reserved'>do</span>
HeightData[x,y] := Bmp.Canvas.Pixels[x,y] <span class='reserved'>div</span> clWhite;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 11, 2003 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
Du hast doch selbst gesagt, dass du nicht wüsstest, wie man das anders machen würde... Anstatt dich zu freuen, dass ich hier ne andere lösung präsentiere, meckerst du gleich rum ;)

Nun ja, der Code oben sieht zT auch kompliziert aus, weil der ganze dynamische Kram drinn steht.

Und wenn es auf Geschwindigkeit ankommt (was hier wohl nicht der Fall ist) , ist es bestimmt schneller nur jeweils einen Wert pro Pixel einzulesen, anstatt drei einzulesen und noch zu teilen. Das mit der Umkopiererei in der zweiten Schleife könnte man auch bessser lösen, so dass eigentlich gar keine zweite Schleife benötigt wird.

Aber wie gesagt, es ging mir jetzt auch nicht darum deine Lösung auszubooten, sondern halt nur nen anderen Ansatz zu zeigen, der mir selbst auch logischer erscheint, da wie gesagt halt die Farbe gleich aus dem Spiel gelassen wird.

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 11, 2003 22:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Pixels ist um einiges langsamer als Scanline, aber da das hier ja nur einmal ausgelesen wird und das Bild klein ist, spielt das in diesem Fall vermutlich keine große Rolle.
Ich habe das mal ausprobiert und bei meinem Test war die scanline Methode ungefähr 300 Mal schneller. Das liegt unter anderem auch daran, daß man nicht für jeden Pixel eine Funktion aufruft. Beide Methoden haben ein Graustufen Bild als Basis benutzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 12, 2003 09:17 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Selbstverständlich kannst du das BMP auch direkt laden (ist ja ein recht einfaches Bildformat, insbesondere wenn du dich auf 8 Bit Graustufen BMPs beschränkst). Dann brauchst du nicht mal die VCL und dein Programm kann ziemlich klein bleiben (insbesodere wenn du es schaffst, auch noch auf die sysutils zu verzichten)...

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 12, 2003 13:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 07, 2003 15:25
Beiträge: 77
Also erstmal danke an alle !!!
Ich hab das jetzt irgendwie hingekriegt. Ich hab die Pixel Ausles Methode genommen, weil ich bei dem C Source nicht so richtig durchsehe.
Trotzdem Danke Mindwalker.

_________________
Wer Ordnung hält, ist zu faul zum Suchen


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 6 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.008s | 15 Queries | GZIP : On ]