<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://wiki.delphigl.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Haris</id>
		<title>DGL Wiki - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.delphigl.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Haris"/>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php/Spezial:Beitr%C3%A4ge/Haris"/>
		<updated>2026-04-21T18:59:35Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://wiki.delphigl.com/index.php?title=Screenshot&amp;diff=7627</id>
		<title>Screenshot</title>
		<link rel="alternate" type="text/html" href="https://wiki.delphigl.com/index.php?title=Screenshot&amp;diff=7627"/>
				<updated>2005-05-24T17:56:50Z</updated>
		
		<summary type="html">&lt;p&gt;Haris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Allgemeines zum Screenshot erstellen =&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Ein '''Screenshot''' ist ein Abbild des aktuellen Bildschrim Inhaltes. In dem Falle von OpenGL greifen wir aber nicht auf das Fenster zurück sondern auf den [[Framebuffer]]. Neben dem eigentlichen Vorgang, nämlich der Besorgung der Bilddaten, ist es meißtens auch noch sinnvoll die Daten dem Benutzer verfügbar zu machen. Dies geschieht meistens in Form einer Bild-Datei oder eines Eintrages in der Zwischenablage.&lt;br /&gt;
&lt;br /&gt;
== Bilddaten besorgen ==&lt;br /&gt;
Mit Hilfe des [[glReadPixels]] Befehl kann der [[Framebuffer]] ausgelesen werden. Für einen Screenshot sind meißtens die [[RGB]]-Werte interessant. Bei diesen Werten ergibt sich auch schon das erste Problemm OpenGL speichert die Daten in der Reinfolge Rot Grün Blau, wärend es in einigen Bildformaten (nämlich denen die auf Bitmaps aufbauen) üblich ist die Daten in der Reinfolge Blau Grün Rot zu speichern. Glücklicherweise kann man in aktuellen OpenGL Versionen [[glReadPixels]] anweisen die Daten auch in dieser Reinfolge zu liefern.&lt;br /&gt;
&lt;br /&gt;
Der [[glReadPixels]] Befehl für neue Grafikarten könnte in etwa so aussehen:&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
  // ungünstige Reinfolge Rot Grün Blau &lt;br /&gt;
  glReadPixels( 0, 0, Breite, Hoehe, GL_RGB, GL_UNSIGNED_BYTE, Daten );&lt;br /&gt;
  // auf neuren Grafikarten:&lt;br /&gt;
  glReadPixels( 0, 0, Breite, Hoehe, GL_BGR, GL_UNSIGNED_BYTE, Daten );&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was die einzelen Parameter bedeuten, könnt ihr im [[glReadPixels]] Artikel nachlesen. Es sei hier nur gesagt das das letzte Argument der Speicherplatz ist, an den OpenGL die Daten abspeichern soll(meißt ein Pointer z.B. auf ein Array).&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Anleitung]]&lt;br /&gt;
&lt;br /&gt;
= Speichern im TGA Format =&lt;br /&gt;
&lt;br /&gt;
Eine TGA-Datei hat einen relativ einfachen Aufbau. Als erstes kommen Header-Informationen und dannach die Daten. Der Header sieht so aus:&lt;br /&gt;
&amp;lt;pascal&amp;gt;type &lt;br /&gt;
  TTGAHEADER = packed record&lt;br /&gt;
    tfType : Byte;&lt;br /&gt;
    tfColorMapType : Byte;&lt;br /&gt;
    tfImageType : Byte;&lt;br /&gt;
    tfColorMapSpec : Array[0..4] of Byte;&lt;br /&gt;
    tfOrigX : Word; //Array [0..1] of Byte;&lt;br /&gt;
    tfOrigY : Word;&lt;br /&gt;
    tfWidth : Word;&lt;br /&gt;
    tfHeight : Word;&lt;br /&gt;
    tfBpp : Byte;&lt;br /&gt;
    tfImageDes : Byte;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
Nun zur Speicherfunktion für ein Screenshot ohne Alpha Wert&lt;br /&gt;
&amp;lt;pascal&amp;gt;&lt;br /&gt;
procedure ScreenShot(const Name : string);&lt;br /&gt;
var &lt;br /&gt;
  DataBuffer : array of Byte;&lt;br /&gt;
  f : file;&lt;br /&gt;
  tgaHeader : TTGAHEADER;&lt;br /&gt;
  width, height : integer;&lt;br /&gt;
  DataSize:Integer;&lt;br /&gt;
  viewport : Array[0..3] of integer;&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
  glGetIntegerv(GL_VIEWPORT, @viewport);&lt;br /&gt;
  width := viewport[2];&lt;br /&gt;
  height := viewport[3];&lt;br /&gt;
&lt;br /&gt;
  DataSize := ffWidth * ffHeight * 3;&lt;br /&gt;
&lt;br /&gt;
  SetLength(DataBuffer,DataSize);&lt;br /&gt;
&lt;br /&gt;
  // TGA Kopf mit Daten füllen&lt;br /&gt;
  ZeroMemory(@tgaHeader, SizeOf(tgaHeader));&lt;br /&gt;
  tgaHeader.tfImageType := 2; // TGA_RGB = 2&lt;br /&gt;
  tgaHeader.tfWidth := Width &lt;br /&gt;
  tgaHeader.tfHeight := Height;&lt;br /&gt;
  tgaHeader.tfBpp := 24;&lt;br /&gt;
&lt;br /&gt;
  glReadPixels(0,0,Width, Height, GL_BGR, GL_UNSIGNED_BYTE, @DataBuffer[0]);&lt;br /&gt;
  &lt;br /&gt;
  //Datei erstellen&lt;br /&gt;
  AssignFile(f, Name);&lt;br /&gt;
  Rewrite( f,1 );&lt;br /&gt;
  try &lt;br /&gt;
    // TGA Kopf in die Datei reinschreiben&lt;br /&gt;
    BlockWrite(F, tgaHeader, SizeOf(tgaHeader));&lt;br /&gt;
&lt;br /&gt;
    // Die eigentlichen Bilddaten in die Datei schreiben&lt;br /&gt;
    BlockWrite(f, DataBuffer[0], DataSize );&lt;br /&gt;
  finally&lt;br /&gt;
    CloseFile(f);&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pascal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Anleitung]]&lt;br /&gt;
&lt;br /&gt;
= Speichern im BMP Format =&lt;br /&gt;
&lt;br /&gt;
Auch eine BMP-Datei hat einen relativ einfachen Aufbau. Als erstes kommen Header-Informationen, dann FileInfo-Informationen und dannach die Daten. Der Header sieht so aus:&lt;br /&gt;
&amp;lt;pascal&amp;gt; BITMAPINFOHEADER = packed record&lt;br /&gt;
    biSize: DWORD;&lt;br /&gt;
    biWidth: Longint;&lt;br /&gt;
    biHeight: Longint;&lt;br /&gt;
    biPlanes: Word;&lt;br /&gt;
    biBitCount: Word;&lt;br /&gt;
    biCompression: DWORD;&lt;br /&gt;
    biSizeImage: DWORD;&lt;br /&gt;
    biXPelsPerMeter: Longint;&lt;br /&gt;
    biYPelsPerMeter: Longint;&lt;br /&gt;
    biClrUsed: DWORD;&lt;br /&gt;
    biClrImportant: DWORD;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
 BITMAPFILEHEADER = packed record&lt;br /&gt;
    bfType: Word;&lt;br /&gt;
    bfSize: DWORD;&lt;br /&gt;
    bfReserved1: Word;&lt;br /&gt;
    bfReserved2: Word;&lt;br /&gt;
    bfOffBits: DWORD;&lt;br /&gt;
  end;&amp;lt;/pascal&amp;gt;&lt;br /&gt;
Nun zur Speicherfunktion für ein Screenshot :&lt;br /&gt;
&amp;lt;pascal&amp;gt;procedure ScreenShot(const Name : string);&lt;br /&gt;
 var F : file;&lt;br /&gt;
     FileInfo: BITMAPINFOHEADER;&lt;br /&gt;
     FileHeader : BITMAPFILEHEADER;&lt;br /&gt;
     pPicData:Pointer;&lt;br /&gt;
     Viewport : array[0..3] of integer;&lt;br /&gt;
begin&lt;br /&gt;
 ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER));&lt;br /&gt;
 ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER));&lt;br /&gt;
&lt;br /&gt;
 glGetIntegerv(GL_VIEWPORT, @Viewport);&lt;br /&gt;
&lt;br /&gt;
 FileInfo.biSize := SizeOf(BITMAPINFOHEADER);&lt;br /&gt;
 FileInfo.biWidth := Viewport[2];&lt;br /&gt;
 FileInfo.biHeight := Viewport[3];&lt;br /&gt;
 FileInfo.biPlanes := 1;&lt;br /&gt;
 FileInfo.biBitCount := 32;&lt;br /&gt;
 FileInfo.biSizeImage := FileInfo.biWidth*FileInfo.biHeight*(FileInfo.biBitCount div 8);&lt;br /&gt;
&lt;br /&gt;
 FileHeader.bfType := 19778;&lt;br /&gt;
 FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER);&lt;br /&gt;
 FileHeader.bfSize := FileHeader.bfOffBits + FileInfo.biSizeImage;&lt;br /&gt;
&lt;br /&gt;
 GetMem(pPicData, FileInfo.biSizeImage);&lt;br /&gt;
&lt;br /&gt;
 // get image as 32-bit format&lt;br /&gt;
 glReadPixels(0, 0, Viewport[2], Viewport[3], GL_BGRA, GL_UNSIGNED_BYTE, pPicData);&lt;br /&gt;
// glReadPixels(0, 0, FileInfo.biWidth, FileInfo.biHeight, GL_BGRA, GL_UNSIGNED_BYTE, pPicData);&lt;br /&gt;
&lt;br /&gt;
  AssignFile(f, name);&lt;br /&gt;
  Rewrite( f,1 );&lt;br /&gt;
   BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER));&lt;br /&gt;
   BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER));&lt;br /&gt;
   BlockWrite(F, pPicData^, FileInfo.biSizeImage );&lt;br /&gt;
  CloseFile(f);&lt;br /&gt;
&lt;br /&gt;
 FreeMem(pPicData, FileInfo.biSizeImage);&lt;br /&gt;
end;&amp;lt;/pascal&amp;gt;&lt;/div&gt;</summary>
		<author><name>Haris</name></author>	</entry>

	</feed>