AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Bitmap nach Assign leer. Warum?

Bitmap nach Assign leer. Warum?

Ein Thema von freejay · begonnen am 9. Nov 2020 · letzter Beitrag vom 9. Nov 2020
Antwort Antwort
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
217 Beiträge
 
Delphi 10.3 Rio
 
#1

Bitmap nach Assign leer. Warum?

  Alt 9. Nov 2020, 11:45
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
[Delphi 10.4.1 Sydney Enterprise; Win10; MySQL; VCL]
  Mit Zitat antworten Zitat
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
767 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Bitmap nach Assign leer. Warum?

  Alt 9. Nov 2020, 11:54
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.
Thomas Mueller
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
217 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Bitmap nach Assign leer. Warum?

  Alt 9. Nov 2020, 11:58
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?
[Delphi 10.4.1 Sydney Enterprise; Win10; MySQL; VCL]
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.154 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Bitmap nach Assign leer. Warum?

  Alt 9. Nov 2020, 12:09
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.993 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Bitmap nach Assign leer. Warum?

  Alt 9. Nov 2020, 12:46
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 9. Nov 2020 um 12:50 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
936 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Bitmap nach Assign leer. Warum?

  Alt 9. Nov 2020, 12:49
Hi zusammen
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:
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:
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
217 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Bitmap nach Assign leer. Warum?

  Alt 9. Nov 2020, 13:54
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!
[Delphi 10.4.1 Sydney Enterprise; Win10; MySQL; VCL]
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.992 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Bitmap nach Assign leer. Warum?

  Alt 9. Nov 2020, 14:08
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 BmpTmp.Assign(Image1.Picture.Bitmap); wird ein eventuell vorhandenes (non-Bitmap-)Image gelöscht und eine leere TBitmap zurückgegeben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf