Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bitmap nach Assign leer. Warum? (https://www.delphipraxis.net/206005-bitmap-nach-assign-leer-warum.html)

freejay 9. Nov 2020 10:45

Bitmap nach Assign leer. Warum?
 
Hallo zusammen,

ich weise die Bitmap eines TImage einer anderen Bitmap zu und dann wieder zurück:

Delphi-Quellcode:
procedure TForm26.Button1Click(Sender: TObject);
var
  BmpTmp: TBitmap;
begin
  BmpTmp := TBitmap.Create;
 
  BmpTmp.Assign(Image1.Picture.Bitmap);
  Image1.Picture.Bitmap.Assign(BmpTmp);

  BmpTmp.Free;
end;
Danach ist das Image leer.

Warum? Was mache ich falsch?

Danke & Gruß

Freejay

dummzeuch 9. Nov 2020 10:54

AW: Bitmap nach Assign leer. Warum?
 
Zitat:

Zitat von freejay (Beitrag 1476941)
ich weise die Bitmap eines TImage einer anderen Bitmap zu und dann wieder zurück:

Delphi-Quellcode:
procedure TForm26.Button1Click(Sender: TObject);
var
  BmpTmp: TBitmap;
begin
  BmpTmp := TBitmap.Create;
 
  BmpTmp.Assign(Image1.Picture.Bitmap);
  Image1.Picture.Bitmap.Assign(BmpTmp);

  BmpTmp.Free;
end;
Danach ist das Image leer.

Warum? Was mache ich falsch?


Ist Image1.Picture vorher schon eine Bitmap? Wenn nein, wird das nicht funktionieren. Es gibt keine automatische Konvertierung bei der Zuweisung.

freejay 9. Nov 2020 10:58

AW: Bitmap nach Assign leer. Warum?
 
Das verstehe ich nicht. Ich nutze doch Image1.Picture.Bitmap und nicht bloß Image1.Picture.

Ist denn Image1.Picture.Bitmap nicht automatisch gefüllt? Wenn nein: Wie mache ich das?

Neutral General 9. Nov 2020 11:09

AW: Bitmap nach Assign leer. Warum?
 
Benutz einfach BmpTmp.Assign(Image1.Picture.Graphic). Graphic ist immer gefüllt und egal welches Bildformat geladen ist, die Konvertierung zu BMP sollte ohne Probleme funktionieren.
Image1.Picture.Bitmap ist wirklich nur gefüllt wenns ein Bitmap ist. Picture.Graphic ist quasi die Verallgemeinerung und ist immer gefüllt wenn ein Bild geladen ist.

himitsu 9. Nov 2020 11:46

AW: Bitmap nach Assign leer. Warum?
 
Zitat:

Zitat von Neutral General (Beitrag 1476946)
Image1.Picture.Bitmap ist wirklich nur gefüllt wenns ein Bitmap ist.

In .Graphic ist immer die Instanz. (alle Bilder in Pcture sind TGraphic-Nachfahren, auch TBitmap)
Alle anderen Typbasierenden-Property haben einen Cast drin und da wird bei Aufruf vorher auch der Typ angepasst.

Ist also kein "Bitmap" im Image.Picture geladen, dann wird beim Zugriff auf .Bitmap auch ein TBitmap erstellt und in .Graphic ausgetauscht, aber ohne den Bildinhalt zu kpieren.




.Bitmap ist ein weicher Cast auf .Graphic und somit könnte man sagen es ist immer gefüllt ... nur nicht immer richtig.
Delphi-Quellcode:
function TPicture.GetBitmap: TBitmap;
begin
  ForceType(TBitmap);
  Result := TBitmap(Graphic);
end;

procedure TPicture.ForceType(GraphicType: TGraphicClass);
begin
  ...
  FGraphic.Free;
  FGraphic := GraphicType.Create;
  ...
end;

Delbor 9. Nov 2020 11:49

AW: Bitmap nach Assign leer. Warum?
 
Hi zusammen
Zitat:

Zitat von Neutral General (Beitrag 1476946)
Graphic ist immer gefüllt und egal welches Bildformat geladen ist, die Konvertierung zu BMP sollte ohne Probleme funktionieren.
Image1.Picture.Bitmap ist wirklich nur gefüllt wenns ein Bitmap ist. Picture.Graphic ist quasi die Verallgemeinerung und ist immer gefüllt wenn ein Bild geladen ist.

Fast hätte ich dir jetzt widersprochen, denn was ich zuerst gelesen habe:
Zitat:

Zitat von Neutral General (Beitrag 1476946)
Graphic ist immer gefüllt

Und das stimmt so nicht - TImage.Picture.Graphic ist nur dann gefüllt, wenn da auch eine Grafik (in den möglichen Formaten) enthalten ist. Der Vorteil des Programmierers: er kann auf die Grafik zugreifen, ohne deren Format zu kennen (zumindest vorerst).

Am Ende hab ich dann doch noch deinen Schlussatz gesehen:
Zitat:

Zitat von Neutral General (Beitrag 1476946)
Image1.Picture.Bitmap ist wirklich nur gefüllt wenns ein Bitmap ist. Picture.Graphic ist quasi die Verallgemeinerung und ist immer gefüllt wenn ein Bild geladen ist.

Im vorliegenden Fall könnte er Image1.Picture.Bitmap auf NIL abfragen:
Delphi-Quellcode:
if not (Image1.Picture.Bitmap = NIL) then
begin
// hier etwas mit der Bitmap anstellen.
end;
Wenn der Ausdruck False ist (if Not, also False, ist nicht der Fall) ist eine Grafik im Bitmapformat vorhanden. Andernfalls ist keine Bitmap vorhanden, aber eventuell eine Metagraphik.

Du kannst aber bei TPicture auch eigene Grafikformate regisrieren:

Delphi-Quellcode:
TPicture.RegisterFileFormat('NEF','NEF Format',TWICImage);
TPicture.RegisterFileFormat('TIFF','TIFF Format',TTiffGraphic);

Alle Klarheiten beseitigt? :)

Gruss
Delbor

freejay 9. Nov 2020 12:54

AW: Bitmap nach Assign leer. Warum?
 
Mein lieber Herr Gesangsverein! Da hab' ich ja wieder mal ordentlich was gelernt. Trotz über 20 Jahren Delphi bin ich im Bereich Grafik nämlich ziemlich blank...

Danke an alle!

Uwe Raabe 9. Nov 2020 13:08

AW: Bitmap nach Assign leer. Warum?
 
Zitat:

Zitat von Delbor (Beitrag 1476949)
Im vorliegenden Fall könnte er Image1.Picture.Bitmap auf NIL abfragen:

Das wird nicht viel nützen, denn allein der Aufruf von Bitmap löscht eine eventuell vorhandene Graphic-Instanz, wenn sie kein TBitmap ist. Bitmap wird also niemals nil sein.

Übrigens genau das passiert im Originalcode. In der Zeile
Delphi-Quellcode:
BmpTmp.Assign(Image1.Picture.Bitmap);
wird ein eventuell vorhandenes (non-Bitmap-)Image gelöscht und eine leere TBitmap zurückgegeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 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