Bildausschnitt invertieren [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Bildausschnitt invertieren [gelöst]

Beitragvon haderlump » 4. Apr 2019, 04:13 Bildausschnitt invertieren [gelöst]

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 8. Apr 2019, 04:23, insgesamt 2-mal geändert.
haderlump
 
Beiträge: 169
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon six1 » 4. Apr 2019, 05:22 Re: Bildasuschnitt invertieren

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
six1
 
Beiträge: 158
Registriert: 1. Jul 2010, 18:01

Beitragvon haderlump » 4. Apr 2019, 09:20 Re: Bildasuschnitt invertieren

Danke, ich probiers mal aus.
haderlump
 
Beiträge: 169
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon haderlump » 5. Apr 2019, 05:20 Re: Bildasuschnitt invertieren

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;                         
haderlump
 
Beiträge: 169
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon six1 » 5. Apr 2019, 06:10 Re: Bildasuschnitt invertieren

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
six1
 
Beiträge: 158
Registriert: 1. Jul 2010, 18:01

Beitragvon haderlump » 5. Apr 2019, 09:38 Re: Bildasuschnitt invertieren

Ja. genau. Die zu invertierende Fläche ist ja schon durch das Zielrechteck definiert.
haderlump
 
Beiträge: 169
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon fliegermichl » 5. Apr 2019, 11:20 Re: Bildausschnitt invertieren

CreateRectRgnIndirect und InvertRgn sind Windows API Funktionen. Die gibt es vermutlich auf anderen OS nicht.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 502
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon haderlump » 5. Apr 2019, 17:44 Re: Bildausschnitt invertieren

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?
haderlump
 
Beiträge: 169
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon sstvmaster » 5. Apr 2019, 21:22 Re: Bildausschnitt invertieren

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
sstvmaster
 
Beiträge: 270
Registriert: 22. Okt 2016, 22:12
Wohnort: Dresden
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.6 + Fixes + Trunk 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon haderlump » 6. Apr 2019, 16:53 Re: Bildausschnitt invertieren

Hb ich versucht, LCLExpressions habe ich installiert, geht aber trotzdem nicht. Muss ich da vielleicht im Projekt noch was einbinden ?
haderlump
 
Beiträge: 169
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon MmVisual » 6. Apr 2019, 19:31 Re: Bildausschnitt invertieren

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.
MmVisual
 
Beiträge: 1109
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon six1 » 7. Apr 2019, 06:17 Re: Bildausschnitt invertieren

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
six1
 
Beiträge: 158
Registriert: 1. Jul 2010, 18:01

Beitragvon haderlump » 8. Apr 2019, 04:22 Re: Bildausschnitt invertieren

Danke, jetzt geht's.
Ich hatte nur Windows nicht eingebunden.
again what learned !!
haderlump
 
Beiträge: 169
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: MSN [Bot] und 2 Gäste

porpoises-institution
accuracy-worried