Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Picture unterteilen in kleine Bereiche (https://www.delphipraxis.net/205489-picture-unterteilen-kleine-bereiche.html)

nwnssolutionssoftware 15. Sep 2020 20:55

Picture unterteilen in kleine Bereiche
 
Hallo liebe Community,
ich würde gerne ein JPEG was ich in ein TImage lade anschließend nochmal in 6 gleich große Blöcke unterteilen...
Also das JPEG einmal gesamt in ein Image laden und anschließend nochmal jeweils gleich große Stücke des JPEG´s in die 6 anderen Images laden.

PS. der Sinn dahinter ist, dass ich diese 6 Bereiche nachher auf Unterschiede zum vorherigen Bild prüfen will, da ich das jede Sekunde ausführe...
Und später dann nur die Entscheidenen Bereiche speichere.
Wird ein Screensharing-System... Und das ist der entscheidene Teil um performance reinzubringen.:lol:

Vielen Dank schonmal im Vorraus vllt habt ihr nh Idee wie man sowas umsetzen kann:oops:

TiGü 16. Sep 2020 08:40

AW: Picture unterteilen in kleine Bereiche
 
Du möchtest, dass wir dir ein Beispiel-Projekt erstellen mit sieben TImage-Instanzen, reinladen des JPEGs, anzeigen des JPEGS im Haupt-TImage und dann bspw. per TCanvas.CopyRect sechs Bereiche aus dem JPEG auf die sechs weiteren TImage-Instanzen verteilen?

Blup 16. Sep 2020 12:19

AW: Picture unterteilen in kleine Bereiche
 
Zitat:

Zitat von nwnssolutionssoftware (Beitrag 1473644)
PS. der Sinn dahinter ist, dass ich diese 6 Bereiche nachher auf Unterschiede zum vorherigen Bild prüfen will, da ich das jede Sekunde ausführe...
Und später dann nur die Entscheidenen Bereiche speichere.
Wird ein Screensharing-System... Und das ist der entscheidene Teil um performance reinzubringen.:lol:

Die Grundidee ist schon nicht gut, das Komprimieren und Dekomprimieren der JPG kostet bei jeder Aktion (Kopieren, Vergleichen) Prozessorleistung und nicht zu knapp.

Mein Vorschlag:
- 1.Screenshot erstellen (und Orginalbild übertragen)
- 2.Screenshot erstellen
- Die Bilddaten beider Screenshot mit XOR verknüpfen (macht die Grafikkarte/-treiber z.B. per GDI, sehr schnell)
- Das Differenzbild verlustfrei komprimieren (z.B. RLE-Komprimierung). Da identische Bereiche im Differenzbild schwarz sind, benötigen diese praktisch keine Dateigröße. (und übertragen)
- am Ziel Orginalbild per XOR mit dem Differenzbild verknüpfen und Orginalbild durch neues Bild ersetzen(anzeigen)

Alternativ könnte man z.B. einen Videocodec verwenden.

Übriegens rdpwrap scheint mir eine bereits funktionierende besser Lösung zu sein:
https://github.com/stascorp/rdpwrap

bernhard_LA 16. Sep 2020 12:59

AW: Picture unterteilen in kleine Bereiche
 
d.h. eine 600 * 100 pixel bitmap möchest du in 6 bitmaps a 100 * 100 pixel aufteilen ?

welches Framework FMX oder VCL ?

hanvas 16. Sep 2020 19:02

AW: Picture unterteilen in kleine Bereiche
 
Zitat:

Zitat von nwnssolutionssoftware (Beitrag 1473644)
Hallo liebe Community,
PS. der Sinn dahinter ist, dass ich diese 6 Bereiche nachher auf Unterschiede zum vorherigen Bild prüfen will, da ich das jede Sekunde ausführe...
Und später dann nur die Entscheidenen Bereiche speichere.

Das ganze als JPG zu kodieren kostet Zeit und ist in diesem Fall ineffizient.

Wenn es sich um eine eher statische Szene handelt bei der nur einzelne Objekte bewegt werden, die Kameraposition (sofern vorhanden) fest ist bzw. sich nur wenige Pixel von Bild zu Bild verändern, dann hilft der folgende Ansatz:

Speichere das erste Bild bzw. ein Indexbild. Vergleiche das Bild und das darauf folgende Bild Punkt für Punkt miteinander - das kannst Du machen indem Du die Bildpunkte voneinander abziehst - dabei ergibt sich ein Wert von 0 für Bereiche in denen das Urbild und das darauf folgende Bild gleich sind. Unter den genannten Voraussetzungen ist das gesamte Bild 0 bis auf jene Bereiche in denen Bewegung stattfinden. Also meist viele 0

Dieses "Unterschiedsbild" kannst Du mittels Lauflängenkodierung komprimieren und speichern. Diese Art der Kodierung ist sehr effizient und schnell wenn es viele sich wiederholende Bereiche gibt. Dazu könntest Du Bildpunkte bzw. Reihen von Bildpunkten mit Hilfe von zwei Zahlen speichern. Die erste gibt an wie oft der nachfolgend Wert wiederholt wird:

Beispiel:

0000000011115745599000000000000 (30 Bytes) = 0800,0301,0105,0107,0104,0205,0209,1200 (12 Bytes)

Zur Dekodierung nimmst Du das letzte erhaltene Bild und addierst einfach die sich ergebende Unterschiedswerte. Dieses "neue" Bild ist dann gleichzeitig wieder der Ausgangspunkt für den nächsten Dekodiervorgang.

hth HaJoe

nwnssolutionssoftware 17. Sep 2020 16:30

AW: Picture unterteilen in kleine Bereiche
 
Wow danke für die vielen Hilfestellungen werde das jetzt mal schrittweise durcharbeiten.

Zitat:

Zitat von TiGü (Beitrag 1473657)
Du möchtest, dass wir dir ein Beispiel-Projekt erstellen mit sieben TImage-Instanzen, reinladen des JPEGs, anzeigen des JPEGS im Haupt-TImage und dann bspw. per TCanvas.CopyRect sechs Bereiche aus dem JPEG auf die sechs weiteren TImage-Instanzen verteilen?

Nein natürlich sollt ihr nicht für mich die Arbeit machen sondern wenn einer weiß wie man sowas entweder besser oder genauso umsetzen kann evtl. Hilfestellungen geben weil ich das so in diesem Umfang noch nie gemacht habe.

Aufjedenfall schon mal danke für die vielen Vorschläge.

nwnssolutionssoftware 17. Sep 2020 16:34

AW: Picture unterteilen in kleine Bereiche
 
Zitat:

Zitat von bernhard_LA (Beitrag 1473679)
d.h. eine 600 * 100 pixel bitmap möchest du in 6 bitmaps a 100 * 100 pixel aufteilen ?

welches Framework FMX oder VCL ?

Mit VCL... aber ja das war zumindest ungefair mein Plan.

Ich möchte halt einen Screenshot in kleinere Teile aufteilen um dann zu gucken welche dieser Bereiche sich verändert hat und dann nur diesen Bereich weitergeben.
Wie gesagt soll ein Screensharing system werden, und ich weiß das ungefair diese Technik auch bei VNC verwendet wird das man halt nur den Bereich versendet der sich auch verändert hat.

bernhard_LA 19. Sep 2020 22:28

AW: Picture unterteilen in kleine Bereiche
 
mit der VCL wäre dann Bitblt (... ); die gesuchte Funktion .
Eine ähnliche Frage / incl. Lösung wäre dann hier : https://stackoverflow.com/questions/...itmap-in-place


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz