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

Aktuelle Zeit: Mi Jul 16, 2025 19:43

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Dez 15, 2004 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 23, 2004 20:22
Beiträge: 26
Hallo erst mal alle miteinander.

Ich habe folgendes Anliegen:
Ich möchte ein Bild einscannen ( was kein problem ist )
dann dieses Bild mit gl verändern ( was kein problem ist )
und die Textur wieder als bild speichern ( und das ist mein problem :)

Bisher hab ich schon mal folgendes erarbeitet :
Nach der textures.pas von jan horn lädt man ein jpg-bild, bildet es dann auf ein bmp ab.
dann liest man jeden pixel ( oder was auch immer ) aus und speichert es in
ein array vom typen pointer (pData)
wenn das geschehen ist erstellt man eine neue textur { CreateTexture(...,pdata[0]) }

(falls bisher irgendwas falsch ist, so berichtigt mich bitte )

sowiet ich weis, die bei opengl die variable vom typ gluint (zb. mytex) nur die speicherstelle an, wo das bild sich befindet,
aber auch nur für opengl tauglich (zb ist die speicherstelle der ersten textur bei 1 , der zweiten bei usw )

und hier komme ich nicht weiter:
man könnte zb den speicher auslesen und die textur als bild weider rekonstruieren
oder soetwas in der art...

ODER ( ich aber hab nichts gefunden )
gibt es möglicherweise eine funktion die das konventieren von texturen in bitmaps erlaubt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 15, 2004 17:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Methode die du suchst heißt glReadPixels. Damit kannst du den aktuellen Bildschirminhalt in ein Stück Speicher schreiben wie das was du an OpenGL übergeben hast. Je nachdem wie du das bei glReadPixels eingestellt hast. Dieses kannst du dann wieder in ein Bitmap schreiben und das dann abspeichern.

Für den Fall, dass dein Bild größer als der Bildschirm sein sollte musst du natürlich mehrfach Daten lesen.

Zum Bitmap zusammenbauen müsstest du den Bitmapheader selber schreiben oder du schreibst deine Bilddaten mittels der methode Scanlines in ein TBitmap. Dieses kannst du dann per SaveToFile als Datei speichern. Du musste aber vor dem schreiben alle Eigenschaften (Width, Height, Pixelformat) von dem TBitmap setzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 15, 2004 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Kann man mit RenderToTexture nicht auch den ganzen Fenster-Inhalt speichern?

Wollte außerdem fragen, wie du das machst:
Zitat:
dann dieses Bild mit gl verändern ( was kein problem ist )

Shader, oder was?
Da hat doch auch NVidia mal ein interessantes Video veröffentlicht, in dem der Bildschirminhalt sehr gut, fast schon Profimäßig, wie in Photoshop, gemorpht und verändert wurde...

_________________
"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: Mi Dez 15, 2004 20:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 23, 2004 20:22
Beiträge: 26
1. danke. ich dachte mir schon, dass es soetwas in der art gibt, hab es nur nicht gefunden.

2. nun ja, ich meinte mit verändern einfach soetwas wie die größe zuschneiden
(na klar, denkt ihr jetzt, dass kann man auch mit gimp und co )
aber wenn man sagen wir mal 100 bilder hat, bei denen ich z.b. nur die bildmitte haben will, dann ist es schneller
ein programm zu schreiben, als diese 100 per hand zuzuschneiden.

aber wer weiß, vielleicht wird aus dem programm was nützliches
( ich denke im moment an einen animator für zeichentrick)
dann werde ich euch natürlich informieren !


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 15, 2004 20:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
@La_Boda: Für RenderToTexture bietet es sich glCopyTexImage2D an. Diese Methode kopiert direkt einen Bildausschnitt in eine Textur.

@Mischa: Zum reinen Bilder beschneiden könntest du auch besser direkt mit TBitmap arbeiten. Und dann mit Scanlines. Da du nur Kopierst geht das innerhalb von Millisekunden. Wenn du das richtig machst versteht sich. Also Bild mit TBitmap laden. Gewissen Bereich in ein anderes Kopieren und dann wieder speichern. Dazu musst du keinen Umweg über OpenGL gehen.

Zum Massenresizen von Bildern kann ich im übrigen nur Irfanview empfehlen. Der hat da diverse Möglichkeiten um massenhaft Bilder zu verändern. Wenn du allerdings das gute Stück dann entsprechend noch mit sinnvollen Funktionen erweitern möchtest, dann nur zu. :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 16, 2004 18:35 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 23, 2004 20:22
Beiträge: 26
1. wozu einfach, wenns auch kompliziert geht?
nein, ehrlich, zum einen interessiert mich das, und zum anderen stelle ich mir etwas vor, dass mit zb irfanview bestimmt nicht geht!

2. nun ja, ich muss zugeben, mal wieder nicht weiterzukommen:
soweit der stand meiner arbeit ( und das ist nur ein kleiner ausschnitt, denn ich habe viel ausprobiert ! )

Code:
  1.  
  2. function SaveTexture(Texture: GLuint; x,y,width, height: integer):boolean;
  3.  
  4. var
  5.  
  6.   W: Integer;
  7.  
  8.   H: Integer;
  9.  
  10.   BMP : TBitmap;
  11.  
  12.   Pix : TGraphic;
  13.  
  14. begin
  15.  
  16.   result :=FALSE;
  17.  
  18.  
  19.  
  20.       BMP:=TBitmap.Create;
  21.  
  22.       BMP.pixelformat:=pf32bit;
  23.  
  24.       BMP.Width:=width;
  25.  
  26.       BMP.Height:=height;
  27.  
  28.       //SetLength(Pix, 3);
  29.  
  30.  
  31.  
  32.     try
  33.  
  34.       for H:=0 to height do
  35.  
  36.       begin
  37.  
  38.           for W:=0 to width do
  39.  
  40.           begin
  41.  
  42.             glReadPixels(1, 1, width, height, GL_RGB, GL_BITMAP, Pix);
  43.  
  44.             BMP.Canvas.Draw(0,0,Pix);
  45.  
  46.           end;
  47.  
  48.       end;
  49.  
  50.       BMP.SaveToFile('C:\...\test.bmp');
  51.  
  52.     except
  53.  
  54.       MessageBox(0, PChar('Konnte Texture nicht speichern'), PChar('FEHLER'), MB_OK);
  55.  
  56.       Exit;
  57.  
  58.     end;
  59.  
  60.  
  61.  
  62.   BMP.free;
  63.  
  64.   result :=TRUE;
  65.  
  66. end;

ich habs schon mit pointern und sonst was versucht...
könntet ihr nicht mal handanlegen, damit das was wird?
schon mal jetzt THX für everything


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 16, 2004 19:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich würde wenn dann den kompletten Bereich auf einmal auslesen. Das ist schneller. Und du musst einen Pointer auf einen Speicherbereich übergeben um OpenGL auslesen zu können. Ich würde das in etwa so machen. Kann dir aber nicht sagen ob es funktioniert (höchstwahrscheinlich nicht), da ich das nur mal eben so aus dem Stehgreif programmiert habe.

Code:
  1. function SaveTexture (Texture: GLuint; x,y,width, height: integer):boolean;
  2. var
  3.   BMP : TBitmap;
  4.   Pix, Source: Pointer;
  5. begin
  6.   result :=FALSE;
  7.  
  8.   // Bild erstellen
  9.   BMP:=TBitmap.Create;
  10.   try
  11.     BMP.pixelformat:=pf24bit;
  12.     BMP.Width:=width;
  13.     BMP.Height:=height;
  14.  
  15.     // Temporärer Speicher erstellen
  16.     GetMem(Pix, Width*Height*3);
  17.     try
  18.       Source := Pix;
  19.  
  20.       // Warten bis alle aktionen von OpenGL beendet sind
  21.       glFinish();
  22.  
  23.       // Parameter für das auslesen festlegen
  24.       glPixelStorei(GL_PACK_ALIGNMENT, 3);
  25.       glPixelStorei(GL_PACK_ROW_LENGTH, 0);
  26.       glPixelStorei(GL_PACK_SKIP_ROWS, 0);
  27.       glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
  28.  
  29.       // aus OpenGL lesen
  30.       glReadPixels(0, 0, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, rgbBits);
  31.  
  32.       // In Bitmap kopieren
  33.       for Y := 0 to Bmp.Height -1 do begin
  34.         Move(Source, BMP.Scanline[Y], Width * 3);
  35.         Inc(Source, Width * 3);
  36.       end;
  37.  
  38.       // Speichern
  39.       BMP.SaveToFile('C:\...\test.bmp');
  40.  
  41.        // Speicher frei geben
  42.     finally
  43.       FreeMem(Pix);
  44.     end;
  45.   finally
  46.     BMP.free;
  47.   end;
  48.  
  49.   result :=TRUE;
  50. end;


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


Wer ist online?

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