![]() |
Header einer Grafikdatei auslesen und dann die Datei öffnen
Wie funktioniert dass mit den headern, ich kann so einige Infos über eine BMP Datei erhalten.
Delphi-Quellcode:
Aber wie kann ich dass jetzt in eine Paintbox laden.
var
fileheader: TBitmapfileheader; infoheader: TBitmapinfoheader; s: TFilestream; begin s := TFileStream.Create('c:\tmp\01.bmp', fmOpenRead); try s.Read(fileheader, SizeOf(fileheader)); s.Read(infoheader, SizeOf(infoheader)); finally s.Free; end; listbox1.Items.Clear; listbox1.Items.Add('Filesize: ' + IntToStr(fileheader.bfSize)); listbox1.Items.Add('Width: ' + IntToStr(infoheader.biWidth)); listbox1.Items.Add('Height: ' + IntToStr(infoheader.biHeight)); listbox1.Items.Add('BitCount: ' + IntToStr(infoheader.biBitCount)); listbox1.Items.Add('Used: ' + IntToStr(infoheader.biClrUsed)); end; Und wie kann ich dass mit anderen Dateiformaten machen. |
Re: Header einer Grafikdatei auslesen und dann die Datei öff
|
Re: Header einer Grafikdatei auslesen und dann die Datei öff
Ich will mich mehr mit den einzelnen Dateiformaten befassen und darum wollte ich nicht mit vorbereiteten Komponenten arbeiten.
Also was muss ich machen um das umzusetzen und die Daten laden zu können :gruebel: zb ![]() oder ![]() Ich möchte die Infos in den headern und die Daten auslesen. |
Re: Header einer Grafikdatei auslesen und dann die Datei öff
Du kannst dir ganz einfach deine eigenen Header definieren:
Delphi-Quellcode:
Jetzt mal zum Bleistift.
type
TMyFormatEssentialHeader = record magic: array[0..9] of char; width: Integer; height: Integer; numExtHeaders: Byte; end; TMyFormatExtendedheader = record ExtLen: Integer; ExtType: Byte; end; Dise kannst du dann genauso mit blockread/write oder - eleganter - mit ![]() |
Re: Header einer Grafikdatei auslesen und dann die Datei öff
P
Zitat:
BMP - ![]() PNG - ![]() JPG - ![]() GIF - ![]() PNG - ![]() PNG - ![]() Über Suchmaschinen und Wikipedia sollte sich noch mehr finden lassen. |
Re: Header einer Grafikdatei auslesen und dann die Datei öff
Eine Seite, die man imho nicht vergessen darf, wenn es um Dateiformate und ihren Aufbau geht ist
![]() |
Re: Header einer Grafikdatei auslesen und dann die Datei öff
Jetzt habe ich meine eigenen records für die Header.
Aber was ich noch nicht verstehe ist woher das Programm weis wo die Daten sind, ich habe ja nie angegeben in welchen Offset sie sind. :gruebel: Ich habe bis jetzt auch noch nie mit Streams gearbeitet.
Delphi-Quellcode:
Und warum bekomme ich nicht die richtigen Daten wenn ich einen normalen record anstatt eines packed record verwende :?:
TMyBMPHeader = packed record //Offset
bfType: array[0..1] of char;//0 bfSize: Cardinal; //2 bfReserved: Cardinal; //6 bfOffBits: Cardinal; //10 end; TMyBMPExtendedHeader = packed record biSize: Cardinal; biWidth: Integer; biHeight: Integer; biPlanes: Word; biBitCount: Word; biCompression: Cardinal; biSizeImage: Cardinal; biXPelsPerMeter: Integer; biYPelsPerMeter: Integer; biClrUsed: Cardinal; biClrImportant: Cardinal; end; So wollte ich an die Bilddaten aber ich bekomme immer eine "Access violation at adress 00000004 Read of adress 00000004". :(
Delphi-Quellcode:
var
fileheader: TMyBMPHeader; infoheader: TMyBMPExtendedHeader; s: TFilestream; x, y: integer; PicData: Array of Array of TMyBGRQuad; begin s := TFileStream.Create('c:\tmp\01.bmp', fmOpenRead); try s.Read(fileheader, SizeOf(fileheader)); s.Read(infoheader, SizeOf(infoheader)); finally s.Free; end; with listbox1 do begin Items.Clear; Items.Add('bfSize: ' + IntToStr(fileheader.bfSize)); Items.Add('bfReserved: ' + IntToStr(fileheader.bfReserved)); Items.Add('bfOffBits: ' + IntToStr(fileheader.bfOffBits)); Items.Add('bfSize: ' + IntToStr(fileheader.bfSize)); Items.Add('biWidth: ' + IntToStr(infoheader.biWidth)); Items.Add('biHeight: ' + IntToStr(infoheader.biHeight)); Items.Add('biPlanes: ' + IntToStr(infoheader.biPlanes)); Items.Add('biBitCount: ' + IntToStr(infoheader.biBitCount)); Items.Add('biCompression: ' + IntToStr(infoheader.biCompression)); Items.Add('biSizeImage: ' + IntToStr(infoheader.biSizeImage)); Items.Add('biXPelsPerMeter: ' + IntToStr(infoheader.biXPelsPerMeter)); Items.Add('biYPelsPerMeter: ' + IntToStr(infoheader.biYPelsPerMeter)); Items.Add('biClrUsed: ' + IntToStr(infoheader.biClrUsed)); Items.Add('biClrImportant: ' + IntToStr(infoheader.biClrImportant)); end; s.Position:= fileheader.bfOffBits; SetLength(PicData, infoheader.biWidth);//<--Hier bekomme ich immer die Access violation SetLength(PicData[0], infoheader.biHeight); if infoheader.biHeight > 0 then begin for y:= 0 to infoheader.biHeight do begin for x:= 0 to infoheader.biWidth do begin s.Read(PicData[x,y], SizeOf(TMyBGRTriple)); end; end; end else begin end; PaintBox1.Width:= infoheader.biWidth; PaintBox1.Height:= infoheader.biHeight; for y:= 0 to infoheader.biHeight do begin for x:= 0 to infoheader.biWidth do begin PaintBox1.Canvas.Pixels[x,y]:= RGB(PicData[x,y].r, PicData[x,y].g, PicData[x,y].b) end; end; end; |
Re: Header einer Grafikdatei auslesen und dann die Datei öff
Zitat:
Im packed record liegen die Daten ja eines nach dem anderen drin. Im normalen record wird an bestimmten Speicherstellen ausgerichtet, das heisst, es gibt zwischendurch Lücken. Die in deinem BMP nicht drin sind. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz