Fadenkreuz (transparent) und Bereich markieren
-
- 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
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.
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.
-
- 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
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...
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;
-
- 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
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.
Ich bin mir im Moment nicht sicher, aber in der extgraphics Unit könnte was drin sein.
MFG
Michael Springwald
Michael Springwald
- 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
Aber sicher, neben Hakenkreuzen kann extgraphics auch ein normales Kreuz zeichnen. PaintCross ist da das Richtige.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.
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- 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
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?
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?
-
- 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
Wie MAC schon sagte! mach die am Bessten ein Kreuz.png mit Gimp. Kostet dich im Netz für Windows null, null net nadabr_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?

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
und der Kreis Segeberg meine LIEBE 


-
- 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
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.
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;
-
- 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
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
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
-
- 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
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:
bzw.
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
die zweite
Auf meinen Fall angewandt hieße das also (wenn TRGB die Farbe Tcolor als record (R,G,B) bzw (B,G,R) darstellt:
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);
Code: Alles auswählen
procedure BlendColorsNormOnNorm(SPix, DPix: PPixel32);
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;
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;
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
Grund: Highlighter
-
- 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
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;