Fadenkreuz (transparent) und Bereich markieren

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Fadenkreuz (transparent) und Bereich markieren

Beitrag von br_klaus »

Hallo,
gibt es eine Komponente/Unit, mit der man ein Fadenkreuz über eine Timage erzeugen kann, das dann mit der Maus immer mitwandert. Ebenso auch zum erzeugen von Bereichen (Rechteck, Polygon oder Freihand).
Wenn nicht, dann muß ich das selber machen.
Ich würde das Fadenkreuz auch gerne etwas transparent machen. Wie macht man das? (neue farbe) * Prozent auf Original- Farbe, mit XOR, oder wie?
Dann erst die alten Farben (das geht wohl nur pixelweise) speichern, das Kreuz bzw Reckteck/polygon zeichnen, ei Maus bewegung wierherstellen, neu zeichnen.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Fadenkreuz (transparent) und Bereich markieren

Beitrag von MAC »

wenn du ein starres Farbenkreuz haben willst, dann nimm dafür ein extra image und zeichne dein fadenkreuz mit den paint programm (gimp oder paint.net)
dann kannst du als png speichern und transparenz ist da,
Das von die beschriebene ürde auch gehen, allerdings ist das langsam...
dann wird in onmousemove von fadenkreuz! das fadenkreuz so verschoben, dass sich die mitte unterm curser befindet...

Code: Alles auswählen

Signatur := nil;

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Fadenkreuz (transparent) und Bereich markieren

Beitrag von pluto »

Das kannst du selbst machen. Du könntest z.b. einfach ein TImage nehmen und mit MoveTo und LineTo ein Fadenkreuz zeichnen. Es gibt meine ich aber auch was fertiges. Eine Funktion:
Ich bin mir im Moment nicht sicher, aber in der extgraphics Unit könnte was drin sein.
MFG
Michael Springwald

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Fadenkreuz (transparent) und Bereich markieren

Beitrag von m.fuchs »

pluto hat geschrieben:Das kannst du selbst machen. Du könntest z.b. einfach ein TImage nehmen und mit MoveTo und LineTo ein Fadenkreuz zeichnen. Es gibt meine ich aber auch was fertiges. Eine Funktion:
Ich bin mir im Moment nicht sicher, aber in der extgraphics Unit könnte was drin sein.
Aber sicher, neben Hakenkreuzen kann extgraphics auch ein normales Kreuz zeichnen. PaintCross ist da das Richtige.

Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Fadenkreuz (transparent) und Bereich markieren

Beitrag von br_klaus »

Herzlichen Dank, werde die extgraphics-Unit ausprobieren.

Aber jetzt weiß ich noch immer nicht, wie man transparent zeichnet. Wenn ich zB ein weißes Rechteck habe, das ich transparent über ein Bild legen will, wie macht man das?

Oder ganz konkret: welche Farbe bekommt ein Pixel mit der Farbe alt, wenn ich darüber die Farbe neu transparent (Undurchsichtigkeit in Prozent) lege? Gibt es da eine Formel, die das berechnet? Ich nehme an, daß das für jeden der RGB-Anteile verschieden sein muß.

Ich denke auch, daß es für das Fadenkreuz besser ist, wenn es auf hellen Stellen (Grauwert gering) schwarz wird, an dunklen (hoher Grauwert) weiß. Deshalb müßte ich wohl pixelweise arbeiten.


Ich bräuchte also ein Funktion in dieser Art:

Function Transparenz(alt,neu:TColor; opak:integer): TColor;

Gibt es schon so etwas?

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Fadenkreuz (transparent) und Bereich markieren

Beitrag von Maik81ftl »

br_klaus hat geschrieben:Herzlichen Dank, werde die extgraphics-Unit ausprobieren.

Aber jetzt weiß ich noch immer nicht, wie man transparent zeichnet. Wenn ich zB ein weißes Rechteck habe, das ich transparent über ein Bild legen will, wie macht man das?

Oder ganz konkret: welche Farbe bekommt ein Pixel mit der Farbe alt, wenn ich darüber die Farbe neu transparent (Undurchsichtigkeit in Prozent) lege? Gibt es da eine Formel, die das berechnet? Ich nehme an, daß das für jeden der RGB-Anteile verschieden sein muß.

Ich denke auch, daß es für das Fadenkreuz besser ist, wenn es auf hellen Stellen (Grauwert gering) schwarz wird, an dunklen (hoher Grauwert) weiß. Deshalb müßte ich wohl pixelweise arbeiten.


Ich bräuchte also ein Funktion in dieser Art:

Function Transparenz(alt,neu:TColor; opak:integer): TColor;

Gibt es schon so etwas?
Wie MAC schon sagte! mach die am Bessten ein Kreuz.png mit Gimp. Kostet dich im Netz für Windows null, null net nada :lol:

Da ich sehe, das du Vista verwendest kann ich dir versichern, das es ohne Probleme laufen wird. könnte denne ggf etwas Lahm sein, aber zugegeben auch schnell gelöst als Übergangsvariante. das eigendliche kannst ja denne immer noch als Verbesserung einbinden.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Fadenkreuz (transparent) und Bereich markieren

Beitrag von MAC »

also die mische Fuktion ist gar nicht mal so komplex, ich hab sie so programmiert:

Du kannst die Funktion verwenden, aber ACHTUNG - DIE METHODE JEDES EINZELNE PIXEL BERECHNEN UND ZEICHNEN IST SEHR SEHR LANGSAM.
Im grunde ist es eine Ganz normale Mittelwertberechnung. das percent gibt da die Gewichtung an - z.B wenn man in der Schule Epo: 6 haben sollte und Arbeiten: 1. Wobei die Arbeit 80% zählt.
Endnote = Arbeit*0.8 + Epo*0.2 = 2
Das ganze einmal für Rot - grün und blau.

Code: Alles auswählen

function mischen(a:TColor;zua:TColor;percent:real):TColor;
var
  ar,ag,ab:integer;
begin
ar := trunc(red(a)*(1-percent)+red(zua)*percent);
ag := trunc(green(a)*(1-percent)+green(zua)*percent);
ab := trunc(blue(a)*(1-percent)+blue(zua)*percent);
result := RGBToColor(ar,ag,ab);
end;

Code: Alles auswählen

Signatur := nil;

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Fadenkreuz (transparent) und Bereich markieren

Beitrag von Bora4d »

Altbewährte und sehr einfache Lösung ist XOR-Pen.
Alle anderen Lösungen haben dazu geführt dass wir heutzutage auch für einfache Programme >2 GHz Mehrkern CPU und Monterslüfter PC's haben.

Google einfach nach "Delphi Fadenkreuz" da wirst du Haufenbeispiele finden.
Die Schweizer haben nicht nur Ricola erfunden auch gute Tipps-Seiten:
http://www.swissdelphicenter.ch/de/grafik.php

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Fadenkreuz (transparent) und Bereich markieren

Beitrag von br_klaus »

Herzlichen Dank!

Habe schon viele Hinweise zu Fadenkreuz gefunden. Werde sie ausprobieren.

Habe auch eine ganz simple Funktion für die Transparenz gefunden (bei OpBitmap). Aber wahrscheinlich ist XOR-Pen wohl doch das einfachste.


Da gibt es eine Prozedur (für RGBA-Farben) in zwei Fassungen:

Code: Alles auswählen

procedure BlendColorsNormOnStat(SPix, DPix: PPixel32);
bzw.

Code: Alles auswählen

procedure BlendColorsNormOnNorm(SPix, DPix: PPixel32);
erstere, wenn das "alte" Pixel kein Alpha bzw Alpha = 255 hat (wie bei mir der Fall),
die zweite, wenn beide Pixel Alphawerte haben.

Die erste lautet

Code: Alles auswählen

procedure BlendColorsNormOnStat(SPix, DPix: PPixel32);
var alp1, alp2: integer;
begin
  if SPix^.Alpha = AlphaTransparent then exit else
    if SPix^.Alpha = AlphaOpaque then
      DPix^ := SPix^ else
    begin
      alp1 := SPix^.Alpha;
      alp2 := $FF - alp1;
      DPix^.Red := (DPix^.Red * alp2 + SPix^.Red * alp1) div $FF;
      DPix^.Green := (DPix^.Green * alp2 + SPix^.Green * alp1) div $FF;
      DPix^.Blue := (DPix^.Blue * alp2 + SPix^.Blue * alp1) div $FF;
      //DPix^.Alpha:=$FF;
    end;
end;
die zweite

Code: Alles auswählen

procedure BlendColorsNormOnNorm(SPix, DPix: PPixel32);
var FA,SA,DA: byte;
begin
  if SPix^.Alpha = AlphaTransparent then exit else
    if SPix^.Alpha = AlphaOpaque then
      DPix^ := SPix^ else
    begin
      FA := SPix^.Alpha + (($FF-SPix^.Alpha)*DPix^.Alpha) div $FF;
      if (FA=0) then SA:=0 else SA:=(SPix^.Alpha*$FF) div FA;
      DA := $FF-SA;
      DPix^.Red := (DPix^.Red * DA + SPix^.Red * SA) div $FF;
      DPix^.Green := (DPix^.Green * DA + SPix^.Green * SA) div $FF;
      DPix^.Blue := (DPix^.Blue * DA + SPix^.Blue * SA) div $FF;
      DPix^.Alpha:=(FA);
  end;
end;
Auf meinen Fall angewandt hieße das also (wenn TRGB die Farbe Tcolor als record (R,G,B) bzw (B,G,R) darstellt:

Code: Alles auswählen

Function AlphaBlend(alt,neu: TRGB; alpha:byte):TRGB;
  var n:byte;
  begin 
    if alpha = 0 then result:=alt // Deckung 0%, reine Transparenz
    else if alpha = 255 then result:=neu //Deckung 100%, nur neue farbe zu sehen
    else begin
      n:=255-alpha;
      result.R := (alt.R * n + neu.R * alhpa) div 255;
      result.G := (alt.G * n + neu.G * alpha) div 255;
      result.B := (alt.B * n + neu.B * alpha) div 255;
   end;
  end;
Zuletzt geändert von Lori am Sa 9. Apr 2011, 21:51, insgesamt 1-mal geändert.
Grund: Highlighter

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Fadenkreuz (transparent) und Bereich markieren

Beitrag von MAC »

das letzte ist ein superbeispiel für "Case of"

Code: Alles auswählen

Function AlphaBlend(alt,neu: TRGB; alpha:byte):TRGB;
  var n:byte;
  begin 
  case alpha of
  0:result := alt;
  255: result := neu;
  else begin
      n:=255-alpha;
      result.R := (alt.R * n + neu.R * alhpa) div 255;
      result.G := (alt.G * n + neu.G * alpha) div 255;
      result.B := (alt.B * n + neu.B * alpha) div 255;
   end;
   end;
  end;

Code: Alles auswählen

Signatur := nil;

Antworten