Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TImage Bildbreite ermitteln


Stauch - Di 29.06.04 11:52
Titel: TImage Bildbreite ermitteln
Folgendes kleines lustiges (?) Problem: Ich lade ein Bild in eine TImage Komponente und möchte dann die Anzahl der Pixel ermitteln. Im Prinzip kein Thema:

Delphi-Quelltext
1:
2:
    width:=Image1.picture.Width;
    height:=Image1.picture.Height;


Aber die so ermittelten Werte stimmen nicht mit denen überein, die mir andere Programme (Phase 5 oder Photoshop) anzeigen. Woran könnte das liegen?

C.


MartinPb - Di 29.06.04 12:28

Wenn du die Größe der Bitmap haben willst:


Delphi-Quelltext
1:
2:
width:=Image1.picture.Bitmap.Width;  
height:=Image1.picture.Bitmap.Height;


Wenn du die Größe der Image-Komponete haben willst:


Delphi-Quelltext
1:
2:
width:=Image1.Width;  
height:=Image1.Height;


Stauch - Mi 30.06.04 12:51

bei mir liefert

Delphi-Quelltext
1:
width:=Image1.picture.Bitmap.Width;                    

mit konstanter Bosheit 0. :?


Muetze1 - Mi 30.06.04 14:12

Moin!

Dann hast du wahrscheinlich kein Bitmap geladen sondern z.B. ein MetaFile, Icon, JPEG oder anderes Format/Typ.

MfG
Muetze1


Stauch - Do 01.07.04 09:42

@muetze1: Egal ob gif, jpg oder bmp das Ergebnis ist immer Null :? :?:


Muetze1 - Do 01.07.04 22:49

Moin!

Bei mir nicht. Grundlegendes: Image1.Picture ist das allgemeine Objekt. Für die einzelnen Typen von Grafiken gibt es dann Unterobjekte, wie z.B. JPEG, Bitmap, Icon, Metafile und die haben dann auch wieder ihre Width und Height Angaben die dann direkt den Wert der geladenen Daten entsprechen. Also wenn es bei dir egal ob du nun Image1.Picture.Metafile.Width bei einem Metafile oder Image1.Picture.Icon.Width bei einem Icon immer 0 liefert, dann sprichst du wahrscheinlich das falsche Image an oder zu einem Zeitpunkt wo dieses keine Bilddaten enthält. Schau dir also nochmal deinen Code an...

MfG
Muetze1


Stauch - Fr 02.07.04 10:00

ne,ne, das Bild ist schon da. Ich habe ein bißchen experimentiert, da klappte es auch.
Aber in meinem "Problem"-Programm lade ich die Grafik mit dem folgenden Code(damit auch gifs erkannt werden - den habe ich von espen)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
...
var
  fs : TFileStream;
  olegraphic : TOleGraphic;
begin
  olegraphic := TOleGraphic.create;
  try
    fs := TFileStream.Create(FileName, fmOpenRead or fmSharedenyNone);
    olegraphic.LoadFromStream(fs);
    ImageBox.Picture.Assign(olegraphic);
 ...


und da liefert imagebox.picture.width einen leicht abweichenden Wert (von der tatsächlichen Breite) ...bitmap.width immer noch 0. (Und ich habe tatsächlich ein Bitmap geladen und der Zugriff auf die Eigenschaften erfolgt erst nach dem Laden. Großes Pfadfinderehrenwort :D


MartinPb - Fr 02.07.04 11:19

Du verwendest TOleGraphic. Diese Information hättest du eigentlich schon am Anfang liefern sollen. Ole Objekte sind eigentlich nur bei Arbeiten mit ActiveX zu verwenden. Aber sei's drum.

Wenn du Bitmap.Width gleich 0 hast, dann kannst du keine Bitmap drinn haben. Aber ich hab etwas in der Delphi-Hilfe gefunden:

Hilfe hat folgendes geschrieben:
Da TOLEGraphic OLE-Schnittstellen kapselt, kann die Klasse keine Informationen aus einer Datei lesen oder in einer Datei speichern.


Wie gesagt arbeitest du mit einem Ole Objekt und die haben ihre Eigenarten.


Stauch - Mo 05.07.04 11:06

Zitat:
Du verwendest TOleGraphic. Diese Information hättest du eigentlich schon am Anfang liefern sollen.

Sorry. Ich hielt das nicht für wesentlich.

Aber damit stecke ich jetzt in einme ziemlichen Dilemma: Die Nutzung von TOleGraphic ermöglicht mir den Zugrif auf das .gif-Format, den ich auf andere Weise nicht hinbekommen habe - andererseits kriege ich jetzt wesentliche Informationen (Größe und Auflösung) nicht mehr ordentlich aus dem Datei-Header ausgelesen. :cry:

Wenn jemand einen Tip hat, wie ich rauskomme, ... das wäre stark.