Bildausschnitt invertieren [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Bildausschnitt invertieren [gelöst]

Beitrag von haderlump »

Hallo zusammen
Ich möchte einen Bildasuschnitt einer TImage Komponente invertieren.
Hintergrund: Modellbahnprogramm. Das Bild stellt Das Gleisbild dar. Es besteht im Prinzip aus lauter Einzelflächen der Größe 9x13 Pixel, die in das Gesamtbild kopiert werden.
Nun will ich einzelne Teilausschnitte durch invertieren markieren.
Die Koordinaten liegen als TRect bereits vor.
Der Kopiervorgang wird durch folgende zeile ausgeführt:

Code: Alles auswählen

Hauptform.gleisbild.canvas.CopyRect(zielrechteck,hauptform.Hintergrundbild.canvas,quellrechteck);

Gibt es für Canvas auch eine Methode die das Invertieren bewerkstelligen könnte?
Zuletzt geändert von haderlump am Mo 8. Apr 2019, 05:23, insgesamt 2-mal geändert.

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Bildasuschnitt invertieren

Beitrag von six1 »

Hallo,
ich habe zu Canvas invertieren im Entwickler-Forum etwas gefunden.
Habe es mal kurz mit

Code: Alles auswählen

 InvertRect(form1.canvas, form1.GetClientRect);

ausprobiert... funktioniert gut


Code: Alles auswählen

 
procedure InvertRect(Canvas: TCanvas; const Rect: TRect);
var
  Rgn: hRgn;
begin
  Rgn := CreateRectRgnIndirect(Rect);
  try
    InvertRgn(Canvas.Handle, Rgn);
  finally
  DeleteObject(Rgn);
  end;
end;
 
Gruß, Michael

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Bildasuschnitt invertieren

Beitrag von haderlump »

Danke, ich probiers mal aus.

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Bildasuschnitt invertieren

Beitrag von haderlump »

Ich steig da leider noch nicht ganz durch (blutiger Amateur).
Ich hab es jetzt mal mit folgendem code ausprobiert, bekomme aber die Fehlermeldungen "Error, identifier not found "CreateRectRgnIndirect" ". und "Error, identifier not found "InvertRgn" " .

Code: Alles auswählen

 
procedure zeichenvorgang(symbol,Statusfeld,spalte,reihe:integer);
type hRgn = ^Trect;
var Quellrechteck,zielrechteck:Trect;
H_raster : integer =9;
v_raster : integer = 13;
region:hRgn;
invertfehler:boolean;
begin
    zielrechteck.Left := spalte*H_raster;
    zielrechteck.top := reihe * V_raster;
    zielrechteck.Right:= zielrechteck.Left+H_raster  ;
    zielrechteck.Bottom:= zielrechteck.top + v_raster;
 
    quellrechteck.Left:=symbol*(H_raster+1)+1;
    quellrechteck.Top:=Statusfeld+1;
    quellrechteck.Right:=quellrechteck.Left+H_raster+1;
    quellrechteck.bottom:= quellrechteck.Top + v_raster+1;
   Hauptform.gleisbild.canvas.CopyRect(zielrechteck,hauptform.Hintergrundbild.canvas,quellrechteck);
 
   if bildsch[spalte,reihe].markiert then
           begin
             Region := CreateRectRgnIndirect(zielrechteck);
             invertfehler := InvertRgn(Hauptform.gleisbild.canvas, Region);
           end;
   end;                         

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Bildasuschnitt invertieren

Beitrag von six1 »

Hi,
wenn ich deine Source richtig verstehe, dann

Code: Alles auswählen

 
 if bildsch[spalte,reihe].markiert then
           begin
             invertfehler := InvertRgn(Hauptform.gleisbild.canvas, zielrechteck);
           end;
 
Gruß, Michael

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Bildasuschnitt invertieren

Beitrag von haderlump »

Ja. genau. Die zu invertierende Fläche ist ja schon durch das Zielrechteck definiert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Bildausschnitt invertieren

Beitrag von fliegermichl »

CreateRectRgnIndirect und InvertRgn sind Windows API Funktionen. Die gibt es vermutlich auf anderen OS nicht.

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Bildausschnitt invertieren

Beitrag von haderlump »

Ich bin auf win10 unterwegs. ich habe im Netzt recherchiert, und da gingen die API Anweisungen nur bis WIN NT. Kann aber auch sein, dass die gefunden Seiten veraltet sind.
Es wäre natürlich interessant, ob es die beiden Funktionen auch unter WIN 10 gibt, wenn nein ahbe ich natürlich immer noch keine Lösung für mein Problem.
Hat denn noch keiner ein ähnliches Problem gehabt?

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Bildausschnitt invertieren

Beitrag von sstvmaster »

In den lclextensions in der unit delphicompat.pas gibt es die funktion.

Code: Alles auswählen

function InvertRect(DC: HDC; const lprc: TRECT): Boolean;


Die lclextensions musst du dir event. noch im OPM runterladen.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Bildausschnitt invertieren

Beitrag von haderlump »

Hb ich versucht, LCLExpressions habe ich installiert, geht aber trotzdem nicht. Muss ich da vielleicht im Projekt noch was einbinden ?

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Bildausschnitt invertieren

Beitrag von MmVisual »

Ich hatte auch schon mal in einem Bild was markiert, dazu habe ich ein TShape als Rechteck drüber gelegt und einfach an die Position verschoben.

Ist zwar nicht ganz das was Du willst, jedoch auch eine Möglichkeit.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Bildausschnitt invertieren

Beitrag von six1 »

wo liegt jetzt das Problem?

die APi Funktion InvertRgn funktioniert für Windows unter Lazarus out of the Box.
Falls du für Linux entwickelst, ist diese Funktion nicht verfügbar.

in uses "windows" einbinden, folgender Einzeiler invertiert Form1:

InvertRgn(Form1.Canvas.handle, CreateRectRgnIndirect(Form1.GetClientRect));
Gruß, Michael

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Bildausschnitt invertieren

Beitrag von haderlump »

Danke, jetzt geht's.
Ich hatte nur Windows nicht eingebunden.
again what learned !!

Antworten