Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   TImage und Bitmap (https://www.delphipraxis.net/213846-timage-und-bitmap.html)

juelin 6. Okt 2023 00:20

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

newIndy 6. Okt 2023 08:17

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;

itsChris 6. Okt 2023 08:42

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;

himitsu 6. Okt 2023 09:33

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!

Blup 9. Okt 2023 11:48

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.

Redeemer 11. Okt 2023 19:06

AW: TImage und Bitmap
 
Zitat:

Zitat von Blup (Beitrag 1527856)
Ist keine Grafik vorhanden, muss der Bitmap zumindest die Größe der Zeichenfläche zugewiesen werden, sonst kann man nicht zeichnen.

Greift man ohne Bild auf TImage.Canvas (statt TImage.Picture.Bitmap.Canvas) zu, wird eine weiße Bitmap von der aktuellen Größe von TImage angelegt.

himitsu 11. Okt 2023 23:55

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