Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Gibt es eine Image.picture.bitmap? (https://www.delphipraxis.net/128524-gibt-es-eine-image-picture-bitmap.html)

Mattze 31. Jan 2009 15:22


Gibt es eine Image.picture.bitmap?
 
Hallo,

wenn ich (mit GraphicEx) verschiedene Bilder in Image.picture.graphic lade, gibt es auch für verschiedene Formate ein Image.picture.bitmap. Für einige Formate aber nicht (z. B. jpg, zumindestens, wenn es nicht per GraphicEx geladen wird.)
Wie bekomme ich nun heraus, ob es eine Bitmap dazu gibt oder nicht?
Assigned(Image.picture.bitmap) macht es nicht.
Image.picture.bitmap.handle<>0 macht es (!), aber nach dieser (nur) Abfrage funktioniert das Image selber nicht mehr! (Z. B. Image.refresh)

Wie geht es?

Gruß
Mattze

DeddyH 31. Jan 2009 15:25

Re: Gibt es eine Image.picture.bitmap?
 
Meinst Du Image.Picture.Graphic.Empty?

Mattze 31. Jan 2009 16:30

Re: Gibt es eine Image.picture.bitmap?
 
Nee,

ich glaube nicht!
Noch mal am konkreten Beispiel zum Problem:
Ich lade eine png-Graphic per GraphicEx in Image1.picture.graphic.
Diese Graphic hat (komischerweise) eine Bitmap-Entsprechung in
Image1.picture.bitmap. (Z. B. kann man da ohne Probleme Image2.picture.assign(image1.picture.bitmap) machen!
Ich lade jpg (ohne GraphicEx). Da gibt es keine Bitmap-Entsprechung (Image1.picture.bitmap.handle=0).

Wie kriege ich im geladenen Image1 raus, ob es nun eine Bitmap hat oder nicht?

Sobald ich Image1.picture.bitmap (.handle<>0) abfrage, ist Image1 nicht mehr
"bedienbar". Z. B. geht dann kein image1.refresh mehr!

Gruß
Mattze

Neutral General 31. Jan 2009 16:32

Re: Gibt es eine Image.picture.bitmap?
 
Hi,

Ich denke mal das kannst du rausbekommen mit

Delphi-Quellcode:
Image.Picture.Graphic.Classname
oder auch ClassType. Je nachdem wies dir besser passt ;)

FAlter 31. Jan 2009 16:37

Re: Gibt es eine Image.picture.bitmap?
 
Hi,

Delphi-Quellcode:
 if Image.Picture.Graphic is TBitmap then ...
Das Phänomen kommt daher, dass GraphicEx seine Bildklassen alle von TBitmap abgeleitet hat (bzw. von ein Nachfahre von TBitmap dient als Basisklasse bei GraphicEx).

TPicture.Bitmap ist nur "belegt", wenn es sich bei Graphic um eine TBitmap handelt.

ClassName würde den Namen des Nachfahren liefern...

Mfg
FAlter

DeddyH 31. Jan 2009 16:37

Re: Gibt es eine Image.picture.bitmap?
 
Ginge das nicht auch einfach mit dem is-Operator?

Mattze 31. Jan 2009 17:00

Re: Gibt es eine Image.picture.bitmap?
 
Danke,

mag ja alles stimmen, aber nun verstehe ich rein gar nichts mehr!
Vergesst mal bitte GraphicEx.
Formular mit 2 Image, 3 Button und ein OpenPictureDialog (OPD).
(Das Label ist nur so, damit ich weiß, was ich ausgewählt habe.)
Die Click-Events.
Das ganze bitte mit JPG probieren, wenn Ihr wollt.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OPD.Execute then begin
    label1.caption:=OPD.FileName;
    image1.Picture.LoadFromFile(opd.filename);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    if not image1.Picture.Bitmap.empty then begin
      image2.Picture.Bitmap.Assign(image1.Picture.bitmap)
    end else begin
      showmessage('Bitmap leer');
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  showmessage('Test');
end;
Mit Button1 wird das jpg-Bild nach Image1 geladen.
Button2 testet, ob eine Bitmap da ist und lädt diese in image2. (Quatsch, da es bei JPGs ja keine gibt. Habe ich nur vergessen, rauszunehmen.)
Falls es keine gibt (also bei JPG) wird eine Message angezeigt, die etwas von Image1 verdeckt. (Wichtig!)
Wird diese message "weggeclickt", wird Image1 nicht aktualisiert, refreshed, invalidated... Es bleibt ein grauer (Hintergrund-)kasten.
Nehme ich statt dessen Button3, wird auch nur eine Message angezeigt, die Image1 genauso überdeckt.
Wird die weggeclickt, wird Image1 ordentlich "aktualisiert", wie es sich gehört.

Was mache ich falsch?

Gruß
Matthias

Mattze 31. Jan 2009 19:38

Re: Gibt es eine Image.picture.bitmap?
 
Hallo,

ich habe natürlich weitergespielt.
Und so geht es:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var pic: TPicture;
begin
  pic:=TPicture.Create;
  try
    pic.Assign(image1.picture);
    if not pic.bitmap.empty then begin
      image2.Picture.Bitmap.Assign(image1.Picture.bitmap)
    end else begin
      showmessage('Bitmap leer');
    end;
  finally
    pic.Free
  end;  
end;
Finde ich aber trotzdem unbefriedigend. Vor allen Dingen ärgert mich, dass ich nicht weiß, warum es andersch (sprich: direkt) nicht geht.

Gruß
Mattze


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz