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 TImage Abrunden (https://www.delphipraxis.net/137376-timage-abrunden.html)

youuu 19. Jul 2009 23:12


TImage Abrunden
 
Hi,

wie kann man eine TImage abrunden? Also die Kreisförmig ausschauen lassen?

jaenicke 20. Jul 2009 05:11

Re: TImage Abrunden
 
Indem man ein kreisförmiges Bild hineinlädt? Der Rest ist dann doch transparent und damit unsichtbar. (wenn Transparent auf True steht)

turboPASCAL 20. Jul 2009 06:09

Re: TImage Abrunden
 
Eine Lösung könnte man mit Regionen erreichen.
Einen Schöhnheitspreis kann man damit aner nicht erringen da es kein anti Aliasing oder smooth gibt.

Hier mal ein Beispiel:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  TRGBQuadArray = array [0..1024] of TRGBQuad;
  PRGBQuadArray = ^TRGBQuadArray;
const
  trColor : TRGBQuad = (rgbBlue: 255; rgbGreen: 0; rgbRed: 255; rgbReserved: 0);
var
  rg: HRGN;
  bmp: TBitmap;
  x, y: integer;
  LineScan: PRGBQuadArray;
  LineScan2: PRGBQuadArray;
begin
  bmp := TBitmap.Create;
  try
    bmp.Width := 127;
    bmp.Height := 127;
    bmp.PixelFormat := pf32Bit;

    Image1.Picture.Bitmap.PixelFormat := pf32Bit;

  rg := CreateEllipticRgn(20, 20, 100, 100);

  for y := 0 to bmp.Height - 1 do
  begin
    LineScan := bmp.ScanLine[y];
    LineScan2 := Image1.Picture.Bitmap.ScanLine[y];
    for x := 0 to bmp.Height - 1 do
    begin
      if PtInRegion(rg, x, y)
        then LineScan[x] := LineScan2[x]
        else LineScan[x] := trColor;
    end;
  end;

  Image1.Picture.Bitmap.Assign(bmp);
  Image1.Transparent := true;
  Image1.Invalidate;
  DeleteObject(rg);

  finally
    bmp.free;
  end;
end;

jaenicke 20. Jul 2009 17:51

Re: TImage Abrunden
 
Du benutzt doch wohl nicht ernsthaft die Region, nur um festzustellen, ob sich ein Punkt innerhalb des Kreises befindet? :shock:
Wie wäre es mit dem Satz des Pythagoras oder so? :lol:

Wobei ich nicht weiß wie performant die Abfrage ist, aber ich vermute die Regionsfunktionen sind etwas langsamer.

SirThornberry 20. Jul 2009 18:04

Re: TImage Abrunden
 
@jaenicke: Du willst und jetzt sicher zeigen wie man mit dem Satz des Pythagoras feststellen kann ob ein Punkt innerhalb einer Ellipse liegt - viel Spaß :roll:
Bevor du dich über etwas lustig machst prüfe bitte nach ob es auch wirklich möglich ist und zeige lieber die bessere Lösung anstelle dich nur lustig zu machen.

jaenicke 20. Jul 2009 18:05

Re: TImage Abrunden
 
Zitat:

Zitat von youuu
wie kann man eine TImage abrunden? Also die Kreisförmig ausschauen lassen?

Darauf habe ich mich natürlich bezogen...
Von einer Ellipse war erst bei der Regionsfunktion die Rede, die aber hier auch für einen Kreis benutzt wird.

DeddyH 20. Jul 2009 18:07

Re: TImage Abrunden
 
Und dann wird der Kreis zu einer anderen Form geändert, weil das vielleicht besser aussieht und schon geht die ganze Berechnung von vorne los? Manche haben anscheinend zuviel Zeit.

SirThornberry 20. Jul 2009 18:11

Re: TImage Abrunden
 
@jaenicke: Mir ging es nicht primär um Kreis oder Ellipse sondern darum, dass es allen mehr hilft eine Lösung bzw. Alternativen aufzuzeigen anstelle nur andere Lösungen schlecht zu machen oder nur in der Theorie zu erzählen das es doch möglich sein sollte.

turboPASCAL 20. Jul 2009 18:27

Re: TImage Abrunden
 
Zitat:

Zitat von jaenicke
Du benutzt doch wohl nicht ernsthaft die Region, nur um festzustellen, ob sich ein Punkt innerhalb des Kreises befindet?

Ja. Warum auch nicht. Es ist schnell und man muss nicht ewig rumrechnen.

Zitat:

Zitat von jaenicke
Wie wäre es mit dem Satz des Pythagoras oder so? :lol:

Die Quadratur des Kreises...

Zitat:

Zitat von jaenicke
Wobei ich nicht weiß wie performant die Abfrage ist, aber ich vermute die Regionsfunktionen sind etwas langsamer.

Recht fix. Wobei ich nicht über grosse Bilder nachdenke.


Ich hatte mir das mit den Grgionen mal überlegt mal überlegt um ein Roundrect darzustellen. (Beispiel: DF )
Dort nutze ich SelectClipRgn(); um die sache abzurunden.


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