Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Abgerundete Ecken (https://www.delphipraxis.net/108923-abgerundete-ecken.html)

Moony 21. Feb 2008 09:41


Abgerundete Ecken
 
Hallo zusammen,

ich lade mit einem TImage-Objekt ein Bild und stelle das auf der Oberfläche dar. Hierzu möchte ich dieses Objekt mit definierbaren abgerundeten Ecken darstellen. Es ist sowas wie das Canvas.RoundRect(). Aber wenn ich diese Funktion anschließend anwende, dann wird ein weißes Rechteck mit abgerundeten Ecken auf mein geladenes Bild gezeichnet. Ich möchte aber, dass das Bild selbst die abgerundeten Ecken hat.


Hoffe ihr könnt mir helfen.

Gruß, Moony

Kroko1999 21. Feb 2008 09:49

Re: Abgerundete Ecken
 
ein Bitmap mit dem Bild
ein Bitmap mit einem weißen roundRect und weiß gefüllt, der Rest schwarz
beide Bitmap and verknüpfen und ausgeben

Moony 21. Feb 2008 10:11

Re: Abgerundete Ecken
 
Irgendwie verstehe ich nciht ganz wie ich die beiden verknüpfen soll? Könntest du mir da ein wenig Code hinschreiben?

DeddyH 21. Feb 2008 10:15

Re: Abgerundete Ecken
 
Delphi-Quellcode:
BitBlt(MaskBitmap.Canvas.Handle, 0, 0, MaskBitmap.Width, MaskBitmap.Height, DeineBitmap.Canvas.Handle, 0, 0, SRCAND);
Sollte so gehen.

Moony 21. Feb 2008 10:31

Re: Abgerundete Ecken
 
Die beiden TImage-Objekte werden zwar jetzt verbunden, aber die Ecken des eigentlichen Bildes sind noch da. Ich möchte auch keinen schwarzen Rand haben, sondern lediglich bei dem Bild das ich lade die Ecken rund zeichnen mit einem bestimmten Radius.

DeddyH 21. Feb 2008 10:58

Re: Abgerundete Ecken
 
http://www.ucancode.net/faq/Draw_Transparent_bitmap.htm

Moony 28. Feb 2008 11:35

Re: Abgerundete Ecken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Erst mal Sorry, dass ich hier so lange keine Antwort gegeben habe.

Also irgendwie will das bei mir nicht funktionieren mit den runden Ecken. Ich stelle mal den Code hier rein, damit ihr euch ein Bild davon machen könnt, was ich meine.

Also, ich habe ein Bild geladen, welches auf die vorgesehene Größe des Images geladen wird. In dem Eingabefeld darunter wird der Radius der runden Ecken in Pixel angegeben. Danach muß auf "Round" geklickt werden. Wie ihr seht, werden folgende Punkte gemacht:

1. Der schwarze Rand ist da. Diesen möchte ich nicht haben.
2. Das Bild wird auf seine ursprüngliche Größe in das Image geladen.
3. Die Ecken des Bildes sind nicht rund.

Ich hoffe ihr wißt eine Lösung, denn ich verzeweifle hier ein wenig. :wall:

Gruß & Danke, Moony

Moony 29. Apr 2008 13:54

Re: Abgerundete Ecken
 
Hallo zusammen,

weißt denn keiner eine Antwort auf mein Problem??? :cry:

Gruß, Moony

_frank_ 29. Apr 2008 18:18

Re: Abgerundete Ecken
 
ich habe hier mal ein bild mit einer selbstgemalten maske umgeformt..
du musst im Prizip genau das Gleiche machen :) nur halt mit roundRect statt ellipse

HTH Frank

Moony 5. Mai 2008 09:36

Re: Abgerundete Ecken
 
Hallo,

ich habe das jetzt so gemacht:

Delphi-Quellcode:
procedure DoItRound;
var bmp_mask,
      bmp_tmp  : TBitmap;

const cl_trans_tmp = clWhite;
      cl_trans    = clFuchsia;
begin
  bmp_mask := TBitmap.create;
  bmp_tmp := TBitmap.create;
  try
     //load bitmap
     bmp_tmp.Assign(Form1.image1.picture.bitmap);
     //resize mask
     bmp_mask.width := bmp_tmp.width;
     bmp_mask.height := bmp_tmp.height;
     //create the mask;
     bmp_mask.canvas.brush.color := cl_trans;
     bmp_mask.canvas.Pen.color  := cl_trans;
     bmp_mask.Canvas.FillRect(rect(0,0,bmp_mask.width,bmp_mask.height));
     bmp_mask.canvas.brush.color := cl_trans_tmp;
     bmp_mask.canvas.Pen.color  := cl_trans_tmp;
     bmp_mask.canvas.RoundRect(0,0,bmp_mask.width,bmp_mask.height, 10,10);
     bmp_mask.TransparentColor  := cl_trans_tmp;
     bmp_mask.Transparent       := true;

     //merging the mask with original bitmap
     bmp_tmp.Canvas.Draw(0,0,bmp_mask);
     bmp_tmp.TransparentColor := cl_trans;
     bmp_tmp.Transparent     := true;

     //Draw masked bitmap
     Form1.Image2.canvas.draw(0,0,bmp_tmp);
  finally
     //free Objects
     bmp_tmp.free;
     bmp_mask.free;
  end;
end;
Leider wird hier nur das Bild reingezeichnet ohne jegliche runde Ecken.
Zeichne ich das Ganze anstatt auf das Image2 auf mein Canvas der Form1, dann funktioniert das.

In meinem Programm zeichne ich aber auf das Canvas eines Imageobjektes und nicht auf das Canvas der Form.

Gruß, Moony

_frank_ 5. Mai 2008 13:33

Re: Abgerundete Ecken
 
ich hab das nochmal mit dinem Code probiert und festgestellt, dass der definierte bereich ggf. nur andersfarbig gemalt wird und deshalb nicht transparent. Ursache dafür war bei meinen Tests die Farbtiefe...

wenn ich bei der initialisierung (vor dem erstellen der Maske) die Farbtiefe beider bitmaps auf 24bit stelle funktioniert es bei mir.

Delphi-Quellcode:
     bmp_mask.PixelFormat:=pf24Bit;
     bmp_tmp.PixelFormat:=pf24Bit;
HTH Frank

Moony 5. Mai 2008 14:36

Re: Abgerundete Ecken
 
Liste der Anhänge anzeigen (Anzahl: 1)
hmm, also hier passiert immer noch das gleiche, nämlich nichts. Egal wie und wo ich das Pixelformat setze, wird mein Bild nicht mit runden Ecken angezeigt.

Ich stelle mal mein Testprojekt diesbezüglich hier rein. Im Programm auf den "Do It Round" - Button klicken.

_frank_ 5. Mai 2008 14:55

Re: Abgerundete Ecken
 
bei mir funktioniert das... (gesteted mit zapotek.bmp aus windows-verzeichnis und 20er Rundung)

Delphi-Quellcode:
     //resize mask
     bmp_mask.pixelformat := pf24bit;
     bmp_tmp.pixelformat := pf24bit;
     bmp_mask.width := bmp_tmp.width;
     bmp_mask.height := bmp_tmp.height;
was mir auffällt..du hantierst mit image.canvas rum...evtl solltest du die procedure DoItRound auch auf das Canvas ausbauen...auch damit jpegs und andere grafiken unterstützt werden.
weiterhin würde ich die DoItRound so umbauen, dass du rundung,quell und zielcanvas übergibst, damit es unabhängig von dem Formular ist, sowie die prüfungen auf nil (assigned) in die procedure verlagern.

HTH Frank

Moony 5. Mai 2008 15:18

Re: Abgerundete Ecken
 
Es hat sich rausgestellt, dass es wohl an meinem Bitmap lag. Warum auch immer es bei diesem nicht funktioniert...

Zitat:

evtl solltest du die procedure DoItRound auch auf das Canvas ausbauen
...
Zitat:

auch damit jpegs und andere grafiken unterstützt werden
Das ist ein Testprojekt. Es geht in erster Linie grundsätzlich um die Funktionalität der runden Ecken. Ich muß diese Funktionalität in ein größeres Projekt einbauen. Und dort werden bereits Bilder auf ein Image erstellt und deshalb war es für von Interesse das Ganze auf ein Image.Canvas zu zeichnen.

Somit wird auch auf andere Formate und auf nicht Vorhandensein eines Bildes überprüft.

Eine Frage wirft sich jetzt in dieser Situation noch auf:

Die Bilder werden in ihrer Originalgröße gezeichnet, obwohl von dem Image-Objekt der Wert Strtch bzw. Autosize gesetzt sind. Woran liegt das?

_frank_ 5. Mai 2008 15:34

Re: Abgerundete Ecken
 
Zitat:

Zitat von Moony
Eine Frage wirft sich jetzt in dieser Situation noch auf:

Die Bilder werden in ihrer Originalgröße gezeichnet, obwohl von dem Image-Objekt der Wert Strtch bzw. Autosize gesetzt sind. Woran liegt das?

weil sich TImage.picture.bitmap nicht verändert...du müsstest das canvas als Quelle nehmen...

width,height => Image.width/height
bitblt(image.canvas,0,0,width,height,bmp.canvas,0, 0,srcCopy);

Gruß Frank


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