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

Aktuelle Zeit: So Jul 13, 2025 15:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 256 Farben Bitmap laden
BeitragVerfasst: Di Sep 25, 2007 15:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Hi.
Ich fürchte ich steh grad voll aufm Schlauch. :x

Ich möchte ein 256 Farben Bitmap (8 Bit) laden und als Textur verwenden.
Zuerst kommt der BitmapFileHeader, dann der BitmapInfoHeader, mit die beide keine Probleme bereiten.

Dann kommt die Farbpalette, bei der jeweils 4 Byte eine Farbe repräsentieren (green, blue, red, reserved). Nach der Farbpalette kommen die Pixeldaten, wobei jeder Pixel durch 1 Byte das ein Index zur Farbpalette ist, repräsentiert wird.
Ich hab keine Probleme damit die Daten zu laden, nur wie krieg ich jetzt die BGR-Werte in den Speicher geschoben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 25, 2007 16:05 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Präzisiere dein Problem mal genauer.
Hast du schon RGB/BGR-Daten im Speicher und willst sie an OpenGL übergeben oder hast du nur die palletierten Daten im Speicher und willst sie zu RGB umwandeln?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 25, 2007 16:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Ich habe nur die palletierten Daten im Speicher und will sie zu RGB/BGR umwandeln.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 25, 2007 16:21 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Erste Aktion:
Du rechnest jeden Palettenwert in ein RGBA-Wert um (daher den 4 Bit-Wert auf 8 Bit skalieren). Somit hast du ein Array der Palettenwerte.
Dann reservierst du Speicher für Breite*Höhe*SizeOf(Integer). Jetzt liest du den ersten Pixel des palettierten Bildes und schaust im Array nach. Den Wert aus dem Array speicherst du dann in den vorher reservierten Speicher an die erste Stelle. Dann für den zweiten Pixel bis zum letzten.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


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

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würd beim laden nen array mit der Zuordnung Index->RGB(Reserved) erstellen und dann füllen.
Wenn es dann an die Pixeldaten geht, würd ich garnicht erst die palettenindicies in irgendein array laden, sondern direkt ein Array von RGB-Werten erstellen und das entsprechend von Palette[Index] füllen.
(Ich hoffe, das war verständlich)

Das zeuch kann dann direkt an ogl gegeben werden.
//Edit: @i0n0s: Verdammt, du warst schneller :wink: aber: Die Farbwerte in der Palette sind doch schon 8-bit...

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 25, 2007 18:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
i0n0s hat geschrieben:
Den Wert aus dem Array speicherst du dann in den vorher reservierten Speicher an die erste Stelle. Dann für den zweiten Pixel bis zum letzten.


^^ Genau da wo's richtig interessant wird, hörst du auf...


Bisher hab ich immer mit solchen Konstruktionen gearbeitet:
Code:
  1.  
  2. var
  3.   pixeldata: ^Byte;
  4.  
  5.   GetMem(pixeldata, width*height*3);
  6.  
  7.   Stream.Read(pixeldata^, width*height*3);
  8.  
  9.   glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, pixeldata);
  10.  
  11.   FreeMem(pixeldata);
  12.  


Das funktioniert ja in meinem Fall nicht, da data ja immer an die erste Stelle des reservierten Speichers zeigt und ich die Daten ja nicht in einem Rutsch laden kann.

Was funktionieren müsste wäre wie Lord Horazont vorgeschlagen hat ein Array eines records, in dem die rgb Werte gespeichert werden und dann bei glTexImage2D das nen Pointer auf das Array übergeben?
Gibts eigentlich noch ne Möglichkeit mit so ner Konstruktion zu wie oben zu arbeiten?

(oder laber ich hier grad den totalen Müll?)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 25, 2007 18:21 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Vor glTexImage2D machst du folgendes:
Code:
  1. var
  2.   Palette: Array [0..255] of Integer;
  3.   PalPixel: PByte;
  4.   Pixel: PInteger;
  5.   Mem: Pointer;
  6. begin
  7. .
  8. .
  9. .
  10.   GetMem(Mem, Width * Height * SizeOf(Integer));
  11.   PalPixel := pixeldata;
  12.   Pixel := Mem;
  13.   //Kopieren der Pixel in eine RGBA-Surface.
  14.   for i := 0 to (width * height - 1) do
  15.   begin
  16.     //Auslesen des Farbwertes und speichern
  17.     Pixel^ := Palette[PalPixel^];
  18.     //Erhöhen der Zeiger
  19.     Inc(PalPixel);
  20.     Inc(Pixel);
  21.   end;
  22.   glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, Mem);
  23.   FreeMem(pixeldata);
  24.   FreeMem(Mem);
  25. end;
  26.  


Palette enthält die Farbwerte.

Edit:
Wieder eine Minute schneller :D

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Zuletzt geändert von i0n0s am Di Sep 25, 2007 18:24, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 25, 2007 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Nein, ich denke nicht, dass es eine möglichkeit gäbe, die Daten in einem Rutsch zu laden. Du musst sie ja danach noch bearbeiten und bekommst auf jeden fall ein größeres Array raus als rein.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 25, 2007 18:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
RAH >.<
es gibt ja auch noch PByte und Co - so ein Mist...
DAS meinte ich vorhin als ich sagte das ich auf dem Schlauch stehe - die Lösung ist das einfachste von der Welt und ich komm nicht von selbst drauf und kann das Problem noch nich ma richtig beschreiben :)

Danke euch beiden für die Hilfe!!!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 28, 2007 11:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Noch eine letzte Frage, der Interesse halber...

Code:
  1.  
  2. var
  3.   pixeldata: ^Byte;
  4.   PalPixel: PByte;
  5.  
  6.  
  7.  
  8.   PalPixel := pixeldata;
  9.  


funktioniert nicht. Delphi meint: Inkompatible Typen: 'TestUnit.Byte' und 'System.Byte'
Bei mir hab ich jetzt pixeldata auch zu nem PByte gemacht, was auch problemlos funktioniert. Allerdings interessiert es mich doch ob pixeldata nicht doch ein ^Byte sein kann, oder ob i0n0s einen Denkfehler gemacht hat :twisted:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 28, 2007 12:14 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Code:
  1.   PByte         = ^Byte;

Aus der System.pas
Was hast du bitte für einen Byte in der Testunit definiert?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 28, 2007 12:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das muss nicht zwingend so sein.

Code:
  1. type
  2.   PTempByte = ^Byte;
  3.   PTempByte2 = ^Byte;
  4.  
  5. var
  6.   A : PTempByte;
  7.   B : PTempByte2;
  8.   C : ^Byte;
  9.   D : ^Byte;
  10.  
  11. A := B;
  12. A := C;
  13. B := C;
  14. C := D

Das geht in jedem der Fälle schief, da es für Delphi alles unterschiedliche Typen sind. "Schuld" daran ist die strenge Typprüfung von Delphi.

PS: Wobei Delphi 7 lediglich sagt, dass es inkompatibel ist. Der Zusatz bei dir ließe mich allerdings auch vermuten, dass selber noch mal ein Byte definiert hast??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 28, 2007 12:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
öh, so afaik hab ich gar kein Byte neu definiert... :shock:

mein pixeldata is ne stinknormale lokale Variable...

Code:
  1.  
  2. procedure Load256ColorBitmap(const pFileName: String);
  3. var
  4.   Stream: TStream;
  5.  
  6.   //die anderen Variablen schenk ich mir
  7.  
  8.   pixeldata: ^Byte;
  9.   PalPixel: PByte;
  10. begin
  11.  
  12.   //usw.
  13.  
  14. end;
  15.  


ansonsten...
Byte neu definiert? Wie gesagt, nicht das ich wüsste :?

edit: ich bin grade nochmal meinen Code durchgegangen, aber ich find da nüx wo ich ein Byte definiert haben könnte...
benutzen tu ich Classes.pas, SysUtils.pas und DGLOpenGL.pas...


edit: ich häng die Unit mal an - man sollte aber dazu sagen das ich nicht sehr ordentlich war, aber da sie nur aus einer Prozedur besteht hoffe ich das trotzdem jemand kurz drüber schaut...


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  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.010s | 14 Queries | GZIP : On ]