![]() |
TImage und Bitmap
Hallo,
ich habe Delphi 10.4 und Windows 10. In meinem Programm benutze ich ein TImage in das ich eine Bitmapfile lade. Mit "Image1.Picture.Bitmap.LoadFromFile". Anschliessend möchte ich auf dem Bild einen Kreis zeichnen. "image1.Canvas.Ellipse(vx-5,vy-5,vx+5,vy+5);" Auch der Befehl "image1.Picture.Bitmap.Canvas.Ellipse(vx-5,vy-5,vx+5,vy+5);" bringt nix. Aber den sieht man nicht in dem Bild vom Bitmap. Nur wenn ich den LoadFromFile aus kommentiere sieht man den Kreis. Was mache ich falsch? Bitte gebt mir einen Tipp. Danke und Gruß Jürgen |
AW: TImage und Bitmap
Hallo, normalerweise benutze ich die TImage-Komponente nicht, weil es auch anders/besser (TPaintBox, nichtvisuelle Bitmap ...) geht.
Mein Tipp mit TImage funktioniert so:
Delphi-Quellcode:
procedure TMainForm.Button2Click(Sender: TObject);
begin if OpenPictureDialog1.Execute then Image1.Picture.LoadFromFile(String(OpenPictureDialog1.FileName)); end; procedure TMainForm.Button3Click(Sender: TObject); var w,h:Integer; begin Image1.Center := TRUE; Image1.Stretch := TRUE; Image1.Canvas.Pen.Width := 5; Image1.Canvas.Pen.Color := clRed; Image1.Canvas.Brush.Style := bsClear; //Image1.Canvas.Pen.Style := psSolid; //Image1.Canvas.Pen.Mode := pmCopy; w := Image1.Picture.Bitmap.Width; h := Image1.Picture.Bitmap.Height; Image1.Canvas.Ellipse(5, 5, w-5, h-5); end; |
AW: TImage und Bitmap
Moin,
dein Problem liegt wahrscheinlich darin, dass du die Farbe zum Zeichnen nicht gesetzt hast. In newIndy seinem Beispiel hat er diese auch gesetzt. Du kannst Pen.Color oder Brush.Color nehmen, je nachdem, wie der Kreis aussehen soll. (Gleiches gilt für Bitmap.Canvas)
Delphi-Quellcode:
Image1.Picture.Bitmap.Canvas.Pen.Color := clRed;
//oder Image1.Picture.Bitmap.Canvas.Brush.Color := clRed; |
AW: TImage und Bitmap
Image1.Picture.Bitmap.Canvas.Pen.Width := 5;
... Image1.Picture.Bitmap.Canvas.Ellipse(5, 5, w-5, h-5); :roll: Außer jemand will wirklich absichtlich auf's falsche Canvas malen, aber dann gehört dieses Gemale auch ins OnPaint Paint/WM_PAINT rein, aber niemals bloß in ein Button-Click, oder sowas! |
AW: TImage und Bitmap
Zugriffe auf Image1.Canvas werden automatisch umgeleitet auf Image1.Picture.Bitmap.Canvas .
Man zeichnet im Gegensatz zur Paintbox nicht direkt auf den Bildschirm. Die Grafik wird in Reaktion auf die Nachricht WM_PAINT vom Image auf den Bildschirm kopiert. Enthält das Picture beim Zugriff auf das Property "Bitmap" keine Bitmap sondern eine anderes Grafikformat: - ein neues Bitmap in der Größe der Grafik wird erstellt - die Grafik auf die Bitmap gezeichnet - die Bitmap ersetzt die Grafik Ist keine Grafik vorhanden, muss der Bitmap zumindest die Größe der Zeichenfläche zugewiesen werden, sonst kann man nicht zeichnen. |
AW: TImage und Bitmap
Zitat:
|
AW: TImage und Bitmap
Ohh, mir war so, als konnte man auch selbst auf's Canvas des TImage malen, also quasi nur virtuell über das Bitmap/Graphic drüber und nicht rein. (ohne böse Casts, um an das "richtige" Canvas zu kommen)
Aber nee, mindestens schon seit D6 ist das so :shock: (kann's oben nicht mehr durchstreichen) So, Image.Canvas greift nur auf Image.Picture.Bitmap.Canvas zu. Ist kein TBitmap enthalten, dann wird Eines erstellt. Ist etwas Anderes drin, wie z.B. ein Icon/Gif/Png/Jpeg/usw., dann knallt es. Zugriff auf Image.Picture.Bitmap sorgt immer dafür, dass ein TBitmap drin steckt. Ist was Anderes drin, dann wird es still und heimlich gelöscht und durch ein leeres TBitmap ersetzt. Selbes gilt auch für für Image.Picture.Icon, Image.Picture.Metafile oder Image.Picture.WICImage, wobei dort natürlich TIcon, TMetafile oder TWICImage entstehen. Zugriff auf Image.Picture.Graphic ist somit das Einzig sichere, was immer ein Canvas liefert (außer man weiß ganz genau, dass definitiv und für immer und ewig genau der gewünschte Graphic-Typ drin steckt), also Image.Picture.Graphic.Canvas, aber Image.Canvas macht zumindestens nichst kaputt, also ist was anderes als TBitmap drin, dann knallt es nur, aber das Bild bleibt erhalten. Wäre Image.Canvas wirklich das Canvas der Oberfläche und nicht das des internen Bitmap, dann würde man nur oben drauf malen und beim nächsten Refresh wäre alles weg gewesen. (durch den DesktopWindowManager, seit WinXP, halten "einfache" Canvas aber etwas länger) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz