Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
Delphi 6 Professional
|
AW: Funktion: Graphic anhand des Namens aus Res erstellen
17. Feb 2016, 05:55
Hmm...
Bei Bildern verwende ich eine andere Herangehensweise, gerade, wenn der Dateiname/Dateiende nicht vorhanden ist:
Ich werte die 'Magic Bytes' des FileStreams aus.
Somit kann ich auch zwischen verschiedenen Bildformaten unterscheiden ohne deren Namen zu erkennen.
Funktioniert auch mit ResourceStreams
Mal kurz aus einer meiner Units heraus kopiert:
Delphi-Quellcode:
const
C_Magic_BM : array[0..1] of Byte = (Ord('B'),Ord('M'));
C_Magic_BMP : array[0..2] of Byte = (Ord('B'),Ord('M'),Ord('P'));
C_Magic_XBM : array[0..6] of Byte = (Ord('#'),Ord('d'),Ord('e'),Ord('f'),Ord('i'),Ord('n'),Ord('e'));
C_Magic_JPG : array[0..1] of Byte = ($FF,$D8);
C_Magic_GIF : array[0..2] of Byte = (Ord('G'),Ord('I'),Ord('F'));
C_Magic_WMF : array[0..3] of Byte = ($D7,$CD,$C6,$9A);
C_Magic_PNG : array[0..7] of Byte = (137,80,78,71,13,10,26,10);
C_Magic_JPF : array[0..3] of Byte = ($00,$00,$00,$0C);
C_Magic_JP2 : array[0..7] of Byte = ($00,$00,$00,$0C,$6A,$50,$20,$20);
C_Magic_JPK : array[0..3] of Byte = ($FF,$4F,$FF,$51);
C_Magic_TIF1 : array[0..3] of Byte = ($49,$49,$2A,$00);
C_Magic_TIF2 : array[0..3] of Byte = ($4D,$4D,$00,$2A);
function CheckMagicNo(AFileData : array of Byte; aMagicBytes : array of Byte):boolean;
var
i : integer;
begin
result := length(AFileData) >= length(aMagicBytes);
if result then begin
for i := 0 to length(aMagicBytes) -1 do begin
if AFileData[i] <> aMagicBytes[i] then begin
result := false;
break;
end;
end;
end;
end;
function IsPicture(const AFileName : WideString):boolean;
var
ByteArr : array[0..7] of Byte;
tmpStream : TFileStream;
begin
result := true;
try
if IsWebPFile2(AFileName) then exit; // TWEBPImage
tmpStream := TFileStream.Create(AFileName,fmOpenRead);
try
tmpStream.Position := 0;
if tmpStream.Read(ByteArr,8) = 8 then begin
if CheckMagicNo(ByteArr,C_Magic_BM) then exit; // TBitmap
if CheckMagicNo(ByteArr,C_Magic_BMP) then exit; // TBitmap
if CheckMagicNo(ByteArr,C_Magic_XBM) then exit; // TXBMImage
if CheckMagicNo(ByteArr,C_Magic_JPG) then exit; // TJPEGImage
if CheckMagicNo(ByteArr,C_Magic_GIF) then exit; // TGIFImage
if CheckMagicNo(ByteArr,C_Magic_WMF) then exit; // WMF
if CheckMagicNo(ByteArr,C_Magic_PNG) then exit; // TPNGObject
if CheckMagicNo(ByteArr,C_Magic_JPF) then exit; // JPF
if CheckMagicNo(ByteArr,C_Magic_JP2) then exit; // JP2 JPEG2000
if CheckMagicNo(ByteArr,C_Magic_JPK) then exit; // J2K
if CheckMagicNo(ByteArr,C_Magic_TIF1) then exit; // Tif little endian format
if CheckMagicNo(ByteArr,C_Magic_TIF2) then exit; // Tif big endian format
tmpStream.Position := 0;
if TargaCanLoad(tmpStream) then exit; // TTarga;
end;
result := false; // Kein lesbares Image oder keine 8 bytes
finally
tmpStream.Free;
end;
except
result := false;
// Datei nicht zu öffnen, also ignorieren
end;
end;
Statt des Exits kannst Du dann einfach das TGrafic-Objekt mit dem geladenen Bild zurück geben und anstelle des FileStreams/FileName nimmst Du den ResourceStream.
Somit ist es egal, wie das Bild in der Resource deklariert ist, es kann dort alles als BinStream abgelegt werden.
|