2Images übereinaderlegen...

Für Fragen von Einsteigern und Programmieranfängern...
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

2Images übereinaderlegen...

Beitrag von Bauer321 »

Ich bin echt langsam Ratlos theoretisch sollte das soweit ich es beurteilen kann gehen aber es geht nicht :(

das ist der code, den habe ich ma eben ein wenig erläutert allerdings weiß ich nicht was die ursache des ganzen sein könnte

edit: quelltext jetzt hier: http://ds.redio.de/files/lazarus/upaint1.txt(alte version neuste hier:http://www.lazarusforum.de/viewtopic.php?p=44941#p44941)
Zuletzt geändert von Bauer321 am Sa 12. Feb 2011, 22:45, insgesamt 3-mal geändert.
www.mcpatcher.net | www.hoeper.me

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: 2Images übereinaderlegen...

Beitrag von pluto »

In der MouseMove musst du ein MoveTo und dann ein LineTo machen. Dann sollte es gehen. Im Moment machst du nichts, was sichtbar wird.
MFG
Michael Springwald

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: 2Images übereinaderlegen...

Beitrag von MAC »

gehen wir mal die mouseup procedure , Zeile für Zeile, wie der PC durch.
Also wir haben den Code

Code: Alles auswählen

{1}if (spx < 0) and (spy < 0) then
{2}     begin
{3}       spx := x;
{4}       spy := y;
{5}     end;
{6}  if (spx > -1) and (spy > -1) then
{7}     begin
{8}       FPaint.Image.Canvas.Line(spx,spy,x,y);
{9}       spx := -1;
{10}     spy := -1;
{11}   end;
Wir starten das Programm spx ist -1 . spy ist -1.
Wir gehen in die Prozedure x = 20, y = 30.
Zeile 1: Bedingung erfüllt. spx ist -1 und spy ist -1.
Zeile 3: Ordne spx den wert 20 zu.
Zeile 4:Ordne spy den wert 30 zu.
// stand der Dinge : spx = 20, spy = 30. x = 20, y = 30;
Zeile 6: spx ist >-1 und spy ist >-1, da 20 und 30.
Zeile 8: Wir zeichnen eine Linie. da spx = x und spy =y , für die Katz, man sieht nichts
Zeile 9: spx ist -1
Zeile 10: spy ist -1;


Und die Moral von der Geschicht ? Den Grafen den sieht man nicht.
ja, mehr oder weniger so. weil in der Mousover nochmal spx und spy geprüft werden ob die -1 sind. Und da die das immer sind, weil dein mouseup immer dafür sorgt das am ende spy und spx = -1 sind wird nie gezeichnet...
Das heißt du willst entweder das 1. oder das 2. in der mouseup-funktion abfragen. Hier würde sich ein else empfehlen.

Code: Alles auswählen

{1}if (spx < 0) and (spy < 0) then
{2}     begin
{3}       spx := x;
{4}       spy := y;
{5}     end
{6}   else
{7}     begin
{8}       FPaint.Image.Canvas.Line(spx,spy,x,y);
{9}       spx := -1;
{10}     spy := -1;
{11}   end;
Ach ja, tu mir den Gefallen und ersetze

Code: Alles auswählen

if panel.visible = false
     then panel.visible := true
     else panel.visible := false;
durch

Code: Alles auswählen

panel.visible := not panel.visible; // wert ist boolen. durch das not wird dieser umgedreht...

Code: Alles auswählen

Signatur := nil;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: 2Images übereinaderlegen...

Beitrag von Bauer321 »

danke für eure umfanreichen antworten, ich habe diese umgestzt jedoch funktioniert es leider immer noch nicht.

edit: quelltext jetzt hier: http://ds.redio.de/files/lazarus/upaint2.txt(alte version neuste hier:http://www.lazarusforum.de/viewtopic.php?p=44941#p44941)

lediglich das label welches auch vorher schon ging funktioniert einwandfrei
Zuletzt geändert von Bauer321 am Sa 12. Feb 2011, 22:45, insgesamt 1-mal geändert.
www.mcpatcher.net | www.hoeper.me

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: 2Images übereinaderlegen...

Beitrag von pluto »

Du solltest spx und spY nicht bei MouseUp setzten, sondern bei MouseDown:
Zunächst wird MouseDown ausgelöst. Dann bewegst du die Maus, jetzt wird MouseMove ausgelöst. Du drückst eine andere Taste oder lässt die Taste los wird MouseUp ausgelöst.
MFG
Michael Springwald

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: 2Images übereinaderlegen...

Beitrag von Bauer321 »

wenn ich das änder(also ich habs auch beim objekt gemacht), das hilft auch nicht weiter...
Zuletzt geändert von Bauer321 am So 13. Feb 2011, 01:15, insgesamt 1-mal geändert.
www.mcpatcher.net | www.hoeper.me

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: 2Images übereinaderlegen...

Beitrag von pluto »

Code: Alles auswählen

procedure TFPaint.RedrawPanel();
begin
  FPaint.Panel.Canvas.Pen.Color:= clwhite;  // rand
  FPaint.Panel.Canvas.Brush.Color:= clwhite;  //mitte
  FPaint.Panel.Canvas.Rectangle(0,0,FPaint.Image.Width,FPaint.Image.Height)
end;
Eine frage: Kannst einen Stich sehen, der mit Weißer Farbe auf weißem hintergrund gezeichnet wurde?

edit01: Die Bezeichnung Mitte ist in diesen Fall auch nicht ganz richtig: mit Brush stellst du die Farbe für die Fläche ein.
edit02: Das dürfte ein "Gumiband" Effekt ergeben. Ist das so gewollt?
MFG
Michael Springwald

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: 2Images übereinaderlegen...

Beitrag von Bauer321 »

also eigentlich soll das erste "image" transparent sein und nur die vorschau linie soll in schwarz oder später auch in iener anderen gewünschten farbe drauf zu sehen sein. darunter liegt das eigentliche bild das immer wenn eine linie "erstellt wird"(durch den zweiten klick) diese abbildet(dehalb habe ich mir zum testen auch den show/hide button für das vorschau bild gemacht

edit: dasa ist es da wär ich nie drauf gekommen danke :D

jetzt fehlt mir nur noch der farbwert für transparenz also nen rgb farbert habe ich nciht gefunden(also für tranparenz)
nen hex habe ich gefunden nur weiß ich leider nicht wie ich denn bei lazarus verwenden kann
www.mcpatcher.net | www.hoeper.me

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: 2Images übereinaderlegen...

Beitrag von Socke »

Bauer321 hat geschrieben:jetzt fehlt mir nur noch der farbwert für transparenz also nen rgb farbert habe ich nciht gefunden(also für tranparenz)
nen hex habe ich gefunden nur weiß ich leider nicht wie ich denn bei lazarus verwenden kann
Dieser "hex" kann der Zaubern? Ist das ein Hexer? Ohne die Angabe, was du gefunden hast, können wir dir nicht sagen, was das ist.
Vielleicht hilft dir http://wiki.lazarus.freepascal.org/Colors weiter (insbesondere die Bemerkung zu clNone).

P.S. Ist dir eventuell aufgefallen, dass in RGB gar kein A für den Alpha-Kanal steckt? Da ist es nicht wirklich verwunderlich, dass du keine Transparenz mit RGB darstellen kannst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: 2Images übereinaderlegen...

Beitrag von Bauer321 »

Transparent Hex Code: #FFFFFF Quelle: http://www.opinionatedgeek.com/DotNet/T ... fault.aspx" onclick="window.open(this.href);return false;

und zu clNone, das wird dann nicht transparent
www.mcpatcher.net | www.hoeper.me

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: 2Images übereinaderlegen...

Beitrag von pluto »

Du kannst brush.style auf bsClear stellen. Dann wird kein Hintergrund gezeichnet.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: 2Images übereinaderlegen...

Beitrag von Socke »

Man kann einer Variablen vom Typ TColor direkt einen 64bit Wert zuweisen (ARGB), also

Code: Alles auswählen

cl: TColor;
cl := $FFFFFF;
Da könnte man aber auch direkt die Konstante clWhite verwenden.
Da das höchstwertige Byte den Alpha-Kanal abbildet, kann man auch da einen Wert von 255 (ganz transparent) angeben

Code: Alles auswählen

cl := $FF000000;
Der Bildbereich wird trotzdem übermalt; das heißt: am Ende ist nicht das neu Gezeichnete transparent sondern das gesamte Control.

Wahrscheinlich ist das, was pluto schrieb, genau das was du suchst; Meinen Beitrag nur zur Vollständigkeit.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: 2Images übereinaderlegen...

Beitrag von Bauer321 »

pluto hat geschrieben:Du kannst brush.style auf bsClear stellen. Dann wird kein Hintergrund gezeichnet.
an welcher stelle müsste ich das denn machen?

wenn ich das so mache:

Code: Alles auswählen

procedure TFPaint.RedrawPanel();
begin
  FPaint.Panel.Canvas.Pen.Color:= clwhite;  // rand
  FPaint.Panel.Canvas.Brush.Color:= clwhite;  //mitte
  FPaint.Panel.Canvas.Brush.Style:= bsClear;
  FPaint.Panel.Canvas.Rectangle(0,0,FPaint.Image.Width,FPaint.Image.Height);
end;
dann wird es schwarz aber nicht transparent.

wenn ich das so mache:

Code: Alles auswählen

procedure TFPaint.RedrawPanel();
begin
  //FPaint.Panel.Canvas.Pen.Color:= clwhite;  // rand
  //FPaint.Panel.Canvas.Brush.Color:= clwhite;  //mitte
  FPaint.Panel.Canvas.Brush.Style:= bsClear;
  FPaint.Panel.Canvas.Rectangle(0,0,FPaint.Image.Width,FPaint.Image.Height);
end;
dann wird es auch schwarz aber nicht transparent.

wenn ich das so mache:

Code: Alles auswählen

procedure TFPaint.RedrawPanel();
begin
  FPaint.Panel.Canvas.Pen.Color:= clwhite;  // rand
  FPaint.Panel.Canvas.Brush.Color:= clwhite;  //mitte
  FPaint.Panel.Canvas.Rectangle(0,0,FPaint.Image.Width,FPaint.Image.Height);
  FPaint.Panel.Canvas.Brush.Style:= bsClear;
end;
dann bleiben die striche sprich dieses "löschen" vor dem zeichnen der nächsten vorschaulinie geht nicht mehr
ob es transparent wird kan naufgrund dessen momentan nicht beurteilen

...im Moment benutze ich das TImage ist es evtl besser eine andere Komponente zu verwenden?
www.mcpatcher.net | www.hoeper.me

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: 2Images übereinaderlegen...

Beitrag von pluto »

Du müsstest schon zwei Vierecke Zeichnen:
Einmal mit bsSoild und einmal mit bsClear.
MFG
Michael Springwald

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: 2Images übereinaderlegen...

Beitrag von Bauer321 »

hmm also so gehts auch noch nicht:

Code: Alles auswählen

procedure TFPaint.RedrawPanel();
begin
  FPaint.Panel.Canvas.Pen.Color:= clwhite;
  FPaint.Panel.Canvas.Brush.Color:= clwhite;
  FPaint.Panel.Canvas.Rectangle(0,0,FPaint.Image.Width,FPaint.Image.Height);
  FPaint.Panel.Canvas.Brush.Style:= bsSolid;
 
  FPaint.Panel.Canvas.Rectangle(0,0,FPaint.Image.Width,FPaint.Image.Height);
  FPaint.Panel.Canvas.Brush.Style:= bsClear;
end;
www.mcpatcher.net | www.hoeper.me

Antworten