AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Header einer Grafikdatei auslesen und dann die Datei öffnen
Thema durchsuchen
Ansicht
Themen-Optionen

Header einer Grafikdatei auslesen und dann die Datei öffnen

Ein Thema von MAINFRAIME · begonnen am 16. Jul 2006 · letzter Beitrag vom 17. Jul 2006
Antwort Antwort
MAINFRAIME

Registriert seit: 16. Jul 2006
3 Beiträge
 
#1

Header einer Grafikdatei auslesen und dann die Datei öffnen

  Alt 16. Jul 2006, 19:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#2

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

  Alt 16. Jul 2006, 20:45
http://www.dsdt.info/tipps/?id=323
http://www.dsdt.info/tipps/?id=333
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
MAINFRAIME

Registriert seit: 16. Jul 2006
3 Beiträge
 
#3

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

  Alt 16. Jul 2006, 21:19
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 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.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 16. Jul 2006, 21:25
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#5

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

  Alt 16. Jul 2006, 23:29
P
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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 17. Jul 2006, 08:36
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.
  Mit Zitat antworten Zitat
MAINFRAIME

Registriert seit: 16. Jul 2006
3 Beiträge
 
#7

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

  Alt 17. Jul 2006, 20:14
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.
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;
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 17. Jul 2006, 20:27
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz