uses ..., GraphicColor, GraphicEx;
type T... =
class(TForm)
...
ImaInfo: TImage;
{hier wird die Bilddatei reingeladen}
...
private
...
{ein paar Variablen über die Bildinformation}
prvBitsPerSample, prvSamplesPerPixel, prvChannels,
prvFilterMode, prvBitsPerPixel, prvRotate : byte;
prvXResolution, prvYResolution, prvFileGamma : single;
prvHeight, prvWidth, prvXPelsPerMeter, prvYPelsPerMeter : integer;
prvImageCount, prvPlanes : word;
prvVersion, prvBMPCompression, prvClrUsed, prvClrImportant : cardinal;
prvInterlaced, prvLocalColorTable, prvHasAlpha, prvMono, prvOverview : boolean;
prvCompression: TCompressionType;
prvColorScheme: TColorScheme;
implementation
...
{der Spaß, um die richtigen Werte von ICO-dateien aus deren
{Header auszulesen}
type TIconHeaderInfo =
record
IHfiller :
array[0..5]
of byte;
IHdx : byte;
{width}
IHdy : byte;
{height}
IHfiller2 :
array[0..27]
of byte;
IHbpp : byte;
{bits per pixel}
end;
var IconHeader : TIconHeaderInfo;
{das TPixelFormat in BitsPerPixel convertieren}
function _getPixelFormat(MyPixelFormat:TPixelFormat):byte;
begin
result:=0;
case MyPixelFormat
of
pfDevice: result:=0;
{!?}
pf1bit: result:=1;
pf4bit: result:=4;
pf8bit: result:=8;
pf15bit: result:=15;
pf16bit: result:=16;
pf24bit: result:=24;
pf32bit: result:=32;
pfCustom: result:=0;
{!?}
end;
{case}
end;
{für den TCompressionType in GraphicEx was lesbares kriegen}
function _getCompressionType(ct:TCompressionType):str_12;
begin
result:='
No Info';
case ct
of
ctUnknown: result:='
Unknown';
ctNone: result:='
None';
ctRLE: result:='
RLE';
ctPackedBits: result:='
PackedBits';
ctLZW: result:='
LZW';
ctFax3: result:='
Fax3';
ctFaxRLE: result:='
Fax RLE';
ctFax4: result:='
Fax 4';
ctFaxRLEW: result:='
Fax RLE';
ctLZ77: result:='
LZ77';
ctJPEG: result:='
JPEG New';
ctOJPEG: result:='
JPEG Old';
ctThunderscan: result:='
Thunderscan';
ctNext: result:='
Next';
ctIT8CTPAD: result:='
IT8CTPAD';
ctIT8LW: result:='
IT8LW';
ctIT8MP: result:='
IT8MP';
ctIT8BL: result:='
IT8BL';
ctPixarFilm: result:='
PixarFilm';
ctPixarLog: result:='
PixarLog';
ctDCS: result:='
DCS';
ctJBIG: result:='
JBIG';
ctPCDHuffmann: result:='
PCD Hufman';
end;
{case}
end;
{für den TColorScheme in GraphicColor aka GraphicEx was lesbares kriegen}
function _getColorScheme(colsch:TColorScheme):str_12;
begin
result:='
No Info';
case colsch
of
csUnknown: result:='
Not Defined';
csIndexed: result:='
Indexed';
csG: result:='
Grayscale';
csGA: result:='
Grayscale AC';
csRGB: result:='
RGB';
csRGBA: result:='
RGB AC';
csBGR: result:='
BGR';
csBGRA: result:='
BGR AC';
csCMY: result:='
CMY';
csCMYK: result:='
CMY Black';
csCIELab: result:='
CIE Lab';
csYCbCr: result:='
YCbCr';
csPhotoYCC: result:='
PhotoYCC';
end;
{case}
end;
{die Bilddatei ins Object ImaInfo:TImage laden und ein paar Bildwerte holen}
procedure TMZInfo._loadFile;
var BmpHeader : TBitmapfileheader;
BmpInfo : TBitmapinfoheader;
PicStream : TFileStream;
BmpFile : TBitmap;
PicFile : TPicture;
IconFile : TIcon;
GIFProperties : TGIFGraphic;
PNGProperties : TPNGGraphic;
begin
...
{
Um GIF-dateien handhaben zu können mit dem GraphicEx Tool
muß man einiges zuerst tun:
die mitgelieferte GraphicConfiguration.Inc datei editieren
und dort" {.$define UseLZW}" gegen "
{$define UseLZW}" tauschen
sonst wird zwar "
{$define GIFGraphic}", also das GIF-format definiert,
aber weiter unten wieder "
{$ifndef UseLZW} {$undef GIFGraphic} {$endif}"
entdefiniert. Eine Sicherheitsmaßnahme von Herrn Mike Lischke
um nicht ins Gefängnis zu müssen.
}
{
hier nun das Beispiel für die GIF datei.
prvFile ist z.B. 'Bild.GIF' und prvExt wäre dann '.GIF'.
Interessant wäre eine zusätzliche Information wieviele
Einzelbilder die Datei enthält und was so an Kommentaren
mit drinsteht, aber das Problem habe ich noch nicht gelöst.
}
if ((prvExt = '
.GIF'))
then begin
PicFile:=TPicture.Create;
GIFProperties:=GraphicEx.TGIFGraphic.Create;
try {erster Zugriff auf die Bilddatei}
PicFile.LoadFromFile(prvFile);
{erneuter Zugriff auf die Bilddatei}
GIFProperties.LoadFromFile(prvFile);
{Bild anzeigen}
ImaInfo.Picture:=PicFile;
{Bildwerte holen und sich merken}
prvWidth:=GIFProperties.ImageProperties.Width;
prvHeight:=GIFProperties.ImageProperties.Height;
prvCompression:=GIFProperties.ImageProperties.Compression;
prvBitsPerPixel:=GIFProperties.ImageProperties.BitsPerPixel;
prvBitsPerSample:=GIFProperties.ImageProperties.BitsPerSample;
prvSamplesPerPixel:=GIFProperties.ImageProperties.SamplesPerPixel;
prvColorScheme:=GIFProperties.ImageProperties.ColorScheme;
prvVersion:=GIFProperties.ImageProperties.Version;
prvInterlaced:=GIFProperties.ImageProperties.Interlaced;
prvLocalColorTable:=GIFProperties.ImageProperties.LocalColorTable;
finally
PicFile.Free;
GIFProperties.Free;
end;
...
end;
...
{nur als Beispiel, dasselbe mit einer PNG-datei}
if ((prvExt = '
.PNG'))
then begin
PicFile:=TPicture.Create;
PNGProperties:=GraphicEx.TPNGGraphic.Create;
try PicFile.LoadFromFile(prvFile);
PNGProperties.LoadFromFile(prvFile);
ImaInfo.Picture:=PicFile;
prvWidth:=PNGProperties.ImageProperties.Width;
prvHeight:=PNGProperties.ImageProperties.Height;
prvCompression:=PNGProperties.ImageProperties.Compression;
prvBitsPerPixel:=PNGProperties.ImageProperties.BitsPerPixel;
prvBitsPerSample:=PNGProperties.ImageProperties.BitsPerSample;
prvSamplesPerPixel:=PNGProperties.ImageProperties.SamplesPerPixel;
prvColorScheme:=PNGProperties.ImageProperties.ColorScheme;
prvFileGamma:=PNGProperties.ImageProperties.FileGamma;
prvInterlaced:=PNGProperties.ImageProperties.Interlaced;
prvHasAlpha:=PNGProperties.ImageProperties.HasAlpha;
prvFilterMode:=PNGProperties.ImageProperties.FilterMode;
finally
PicFile.Free;
PNGProperties.Free;
end;
...
end;
{hier nun das, d.h. mein, Problem mit den ICO-dateien}
if ((prvExt = '
.ICN')
or
(prvExt = '
.ICO'))
then begin
IconFile:=TIcon.Create;
try IconFile.LoadFromFile(prvFile);
ImaInfo.Picture.Icon:=IconFile;
{es wird standardmäßig immer ein 32x32 Icon gemeldet}
{und Pustekuchen, was die Farbanzahl einer ICO-datei ist}
{prvWidth:=IconFile.Width; {these values sucks}
{prvHeight:=IconFile.Height; { " }
{prvBitsPerPixel:=?; {not avail}
finally
IconFile.Free;
end;
{um die wahren Werte zu kriegen, bleibt mir nur das hier übrig}
{den IconHeader habe ich oben definiert, siehe TIconHeader}
// read enhanced info of the ICO-file
PicStream:=TFileStream.Create(prvFile, fmOpenRead);
try PicStream.
Read(IconHeader, sizeof(IconHeader));
prvWidth:=IconHeader.IHdx;
{get correct values}
prvHeight:=IconHeader.IHdy;
{ " }
prvBitsPerPixel:=IconHeader.IHbpp;
{ " }
finally
PicStream.Free;
end;
...
end;
{auch bei der BMP-datei erwarten einen einige Probleme}
{wenn man an mehr Werte über die Datei kommen will}
if ((prvExt = '
.BMP'))
then begin
BmpFile:=TBitmap.Create;
try BmpFile.LoadFromFile(prvFile);
ImaInfo.Picture.Bitmap:=BmpFile;
prvWidth:=BmpFile.Width;
prvHeight:=BmpFile.Height;
prvMono:=BmpFile.Monochrome;
prvBitsPerPixel:=_getPixelFormat(BmpFile.PixelFormat);
finally
BmpFile.Free;
end;
// read enhanced info of the BMP-file
PicStream:=TFileStream.Create(prvFile, fmOpenRead);
try PicStream.
Read(BmpHeader, sizeof(BmpHeader));
PicStream.
Read(BmpInfo, sizeof(BmpInfo));
prvXPelsPerMeter:=BmpInfo.biXPelsPerMeter;
prvYPelsPerMeter:=BmpInfo.biYPelsPerMeter;
prvPlanes:=BmpInfo.biPlanes;
prvBMPCompression:=BmpInfo.biCompression;
prvClrUsed:=BmpInfo.biClrUsed;
prvClrImportant:=BmpInfo.biClrImportant;
finally
PicStream.Free;
end;
...
end;
{
Bei den JPEG-dateien arbeite ich noch dran
aber das Format ist ziemlich kompliziert.
Bis jetzt genügt mir die Breite und Höhe des Bildes
und die Farbtiefe von 24 bit setzte ich mal für stets voraus
}
if ((prvExt = '
.JFIF')
or
(prvExt = '
.JPE')
or
(prvExt = '
.JPEG')
or
(prvExt = '
.JPG'))
then begin
PicFile:=TPicture.Create;
try PicFile.LoadFromFile(prvFile);
ImaInfo.Picture:=PicFile;
prvWidth:=PicFile.Width;
prvHeight:=PicFile.Height;
prvBitsPerPixel:=24;
{! :)}
finally
PicFile.Free;
end;
...
end;