Einzelnen Beitrag anzeigen

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