Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Header einer Grafikdatei auslesen und dann die Datei öffnen (https://www.delphipraxis.net/73356-header-einer-grafikdatei-auslesen-und-dann-die-datei-oeffnen.html)

MAINFRAIME 16. Jul 2006 19:51


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:
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;
Aber wie kann ich dass jetzt in eine Paintbox laden.
Und wie kann ich dass mit anderen Dateiformaten machen.

Garfield 16. Jul 2006 20:45

Re: Header einer Grafikdatei auslesen und dann die Datei öff
 
http://www.dsdt.info/tipps/?id=323
http://www.dsdt.info/tipps/?id=333

MAINFRAIME 16. Jul 2006 21:19

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
http://de.wikipedia.org/wiki/Windows_bitmap
oder
http://de.wikipedia.org/wiki/PCX

Ich möchte die Infos in den headern und die Daten auslesen.

DGL-luke 16. Jul 2006 21:25

Re: Header einer Grafikdatei auslesen und dann die Datei öff
 
Du kannst dir ganz einfach deine eigenen Header definieren:

Delphi-Quellcode:
type
  TMyFormatEssentialHeader = record
    magic: array[0..9] of char;
    width: Integer;
    height: Integer;
    numExtHeaders: Byte;
  end;
  TMyFormatExtendedheader = record
    ExtLen: Integer;
    ExtType: Byte;
  end;
Jetzt mal zum Bleistift.

Dise kannst du dann genauso mit blockread/write oder - eleganter - mit Delphi-Referenz durchsuchenTFileStream auslesen und schreiben.

Garfield 16. Jul 2006 23:29

Re: Header einer Grafikdatei auslesen und dann die Datei öff
 
P
Zitat:

Zitat von MAINFRAIME
Ich möchte die Infos in den headern und die Daten auslesen.

Auf den Seiten, die Du verlinkt hast, sind Links und Literatur angegeben. Damit könntest Du Dich beschäftigen.

BMP - http://msdn.microsoft.com/library/de...tmaps_2w1f.asp
PNG - http://www.libpng.org/pub/png/spec/1...-Decoders.html
JPG - http://www.irf.uka.de/seminare/redundanz/vortrag11/
GIF - http://www.irf.uka.de/seminare/redundanz/vortrag10/
PNG - http://www.irf.uka.de/seminare/redundanz/vortrag12/
PNG - http://www.png.de/

Über Suchmaschinen und Wikipedia sollte sich noch mehr finden lassen.

Gausi 17. Jul 2006 08:36

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 wotsit.org. Da findet man zu fast jedem Format ein brauchbare Doku, wie die Dateien aufgebaut sind.

MAINFRAIME 17. Jul 2006 20:14

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:
  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;
Und warum bekomme ich nicht die richtigen Daten wenn ich einen normalen record anstatt eines packed record verwende :?:

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;

DGL-luke 17. Jul 2006 20:27

Re: Header einer Grafikdatei auslesen und dann die Datei öff
 
Zitat:

Zitat von MAINFRAIME
ich habe ja nie angegeben in welchen Offset sie sind.

Doch hast du :)

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