AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TImage und Bitmap

Ein Thema von juelin · begonnen am 6. Okt 2023 · letzter Beitrag vom 11. Okt 2023
Antwort Antwort
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#1

TImage und Bitmap

  Alt 6. Okt 2023, 00:20
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
Jürgen Linder
  Mit Zitat antworten Zitat
Benutzerbild von newIndy
newIndy

Registriert seit: 18. Dez 2018
29 Beiträge
 
Delphi XE3 Professional
 
#2

AW: TImage und Bitmap

  Alt 6. Okt 2023, 08:17
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;
  Mit Zitat antworten Zitat
itsChris

Registriert seit: 29. Jul 2022
24 Beiträge
 
Delphi 12 Athens
 
#3

AW: TImage und Bitmap

  Alt 6. Okt 2023, 08:42
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;

Geändert von itsChris ( 6. Okt 2023 um 10:24 Uhr) Grund: man sollte auf's richtige Canvas malen (himitsu)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: TImage und Bitmap

  Alt 6. Okt 2023, 09:33
Image1.Picture.Bitmap.Canvas.Pen.Width := 5;
...
Image1.Picture.Bitmap.Canvas.Ellipse(5, 5, w-5, h-5);


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!
$2B or not $2B

Geändert von himitsu ( 6. Okt 2023 um 09:39 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#5

AW: TImage und Bitmap

  Alt 9. Okt 2023, 11:48
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.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.081 Beiträge
 
Delphi 2009 Professional
 
#6

AW: TImage und Bitmap

  Alt 11. Okt 2023, 19:06
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: TImage und Bitmap

  Alt 11. Okt 2023, 23:55
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
(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)
$2B or not $2B

Geändert von himitsu (12. Okt 2023 um 00:00 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 16:21 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