|
Registriert seit: 29. Aug 2008 Ort: Nürnberg 9 Beiträge Delphi 6 Enterprise |
#5
Hallo liebe Delphiforumleser,
zu dem Problem, wie man zusätzliche Informationen zu einer Bilddatei bekommt, habe ich folgende Codeausschnitte hier mal reingesetzt.
Delphi-Quellcode:
Soweit bin ich letztes Wochenende gekommen.
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; Ne schöne Woche noch, Tschüß. |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |