AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Bildformat anhand Header erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

Bildformat anhand Header erkennen

Ein Thema von NickelM · begonnen am 29. Okt 2010 · letzter Beitrag vom 31. Okt 2010
 
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

AW: Bildformat anhand Header erkennen

  Alt 30. Okt 2010, 00:05
Habe etwas experimentiert:

Delphi-Quellcode:
const
  GIF_HEADER = AnsiChar($47) + AnsiChar($49) + AnsiChar($46);
  JPG_HEADER = AnsiChar($FF) + AnsiChar($D8) + AnsiChar($FF) + AnsiChar($E0);
  BMP_HEADER = AnsiChar($42) + AnsiChar($4D);
  PNG_HEADER = AnsiChar($89) + AnsiChar($50) + AnsiChar($4E) + AnsiChar($47);
  PSD_HEADER = AnsiChar($38) + AnsiChar($42) + AnsiChar($50) + AnsiChar($53);
  TIF_HEADER = AnsiChar($49) + AnsiChar($49) + AnsiChar($2A);
  TIF_HEADER2 = AnsiChar(77) + AnsiChar(77) + AnsiChar(00);
  WMF_HEADER = AnsiChar($D7) + AnsiChar($CD) + AnsiChar($C6) + AnsiChar($9A);

  MAX_SIGNATURES = 7;

  Signatures: array[0..MAX_SIGNATURES] of TImageSignature = (
    (ImageType: ifGIF; Name: 'Image/GIF'; Signature: GIF_HEADER),
    (ImageType: ifJPG; Name: 'Image/JPEG'; Signature: JPG_HEADER),
    (ImageType: ifPNG; Name: 'Image/PNG'; Signature: PNG_HEADER),
    (ImageType: ifBMP; Name: 'Image/BMP'; Signature: BMP_HEADER),
    (ImageType: ifTIF; Name: 'Image/TIFF'; Signature: TIF_HEADER),
    (ImageType: ifTIF; Name: 'Image/TIFF'; Signature: TIF_HEADER2),
    (ImageType: ifWMF; Name: 'Image/WMF'; Signature: WMF_HEADER),
    (ImageType: ifPSD; Name: 'Image/PSD'; Signature: PSD_HEADER));

type
  TImageType = (ifUnknown, ifJPG, ifGIF, ifBMP, ifPNG, ifPSD, ifTIF, ifWMF);

  TImageSignature = record
    ImageType: TImageType;
    Name: string;
    Signature: AnsiString;
  end;

function CheckImageSignature(AStream: TStream; Signature: AnsiString; Offset:
  Integer): Boolean;
var
  Buffer: AnsiString;
  Count: Integer;
  BytesRead: Integer;
begin
  Result := False;
  try
    Count := Length(Signature);
    AStream.Position := Offset;
    SetLength(Buffer, Count);
    BytesRead := AStream.Read(Buffer[1], Count);
    Result := (BytesRead = Count) and (Buffer = Signature);
  except
  end;
end;

function GetImageType(FileName: string): TImageSignature;
var
  Stream: TFileStream;
  MemStr: TMemoryStream;
  i: Integer;
begin
  Result.ImageType := ifUnknown;
  Stream := TFileStream.Create(FileName, fmOpenRead);
  try
    MemStr := TMemoryStream.Create;
    try
      MemStr.CopyFrom(Stream, 5);
      if MemStr.Size > 4 then
      begin
        Result.ImageType := ifUnknown;
        for i := Low(Signatures) to High(Signatures) do
        begin
          if CheckImageSignature(MemStr, Signatures[i].Signature, 0) then
          begin
            Result.ImageType := Signatures[i].ImageType;
            Result.Name := Signatures[i].Name;
            Break;
          end;
        end;
      end;
    finally
      MemStr.Free;
    end;
  finally
    Stream.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  FileName: string;
  ImgSig: TImageSignature;
begin
  if OpenDialog1.Execute then
  begin
    FileName := OpenDialog1.FileName;
    ImgSig := GetImageType(FileName);
    Label1.Caption := ImgSig.Name;
  end;
end;
Thomas

Geändert von toms (30. Okt 2010 um 00:25 Uhr)
  Mit Zitat antworten Zitat
 


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 20:40 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-2025 by Thomas Breitkreuz