Pixelumwandlung
Übersicht

![]() |
BigmichiBetreff: Pixelumwandlung |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich ewiß net wie ich es genauer nennen soll also ich versuche aus eine Image W1 zu lesen ob der Pixel Rot ist wennja soll er den Pixel von W2 setzen nun hab ich eien funktion geschrieben aber die brauch für ein 1024,768 Bild 24 sekunden ![]() Code: [AUSKLAPPEN] FOR XX = 0 TO 1024
FOR YY = 0 TO 740 setbuffer Imagebuffer(W1) lockbuffer imagebuffer(w1) F1 = readpixelfast(XX,YY+T) r=(F1 AND $FF0000)/$10000 g=(F1 AND $FF00)/$100 b=F1 AND $FF unlockbuffer imagebuffer(W1) IF R = 255 AND G = 0 AND B = 0 THEN setbuffer imagebuffer(BildKachel) lockbuffer imagebuffer(Bildkachel) F1 = readpixelfast(XX,YY+T) r=(F1 AND $FF0000)/$10000 g=(F1 AND $FF00)/$100 b=F1 AND $FF unlockbuffer imagebuffer(BildKachel) setbuffer Imagebuffer(W2) color R,G,B plot XX,YY+T END IF NEXT NEXT Kann mir jemand eine schnellere Routine vorschlagen ? =) |
||
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das hier kannst du weglassen:
Code: [AUSKLAPPEN] r=(F1 AND $FF0000)/$10000
g=(F1 AND $FF00)/$100 b=F1 AND $FF Da reicht dann: Code: [AUSKLAPPEN] If (F1 = 16711680) Then
Und zum schreiben genauso! Statt Plot is WritePixelFast glaub ich schneller, wobei ich davon eh kaum Ahnung hab! Ob mans ansonsten noch optimieren kann, weiss ich nicht |
||
- Zuletzt bearbeitet von Ctuchik am Mi, Mai 26, 2004 13:17, insgesamt einmal bearbeitet
![]() |
Garfield |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube du hast zuviel Lock und unlock
vor dem Schleifendurchlauf Code: [AUSKLAPPEN] setbuffer Imagebuffer(W1)
lockbuffer imagebuffer(w1) erst wenn Bedingung erfüllt ist Code: [AUSKLAPPEN] unlockbuffer imagebuffer(W1)
setbuffer imagebuffer(BildKachel) lockbuffer imagebuffer(Bildkachel) Code: [AUSKLAPPEN] setbuffer Imagebuffer(W1) lockbuffer imagebuffer(w1) FOR XX = 0 TO 1024 FOR YY = 0 TO 740 F1 = readpixelfast(XX,YY+T) r=(F1 AND $FF0000)/$10000 g=(F1 AND $FF00)/$100 b=F1 AND $FF IF R = 255 AND G = 0 AND B = 0 THEN unlockbuffer imagebuffer(W1) setbuffer imagebuffer(BildKachel) lockbuffer imagebuffer(Bildkachel) F1 = readpixelfast(XX,YY+T) r=(F1 AND $FF0000)/$10000 g=(F1 AND $FF00)/$100 b=F1 AND $FF unlockbuffer imagebuffer(BildKachel) setbuffer Imagebuffer(W2) color R,G,B plot XX,YY+T setbuffer Imagebuffer(W1) lockbuffer imagebuffer(w1) END IF NEXT NEXT |
||
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. writepixelfast statt Plot.
2. Die Anzahl an Lockbuffer() durch verwenden eines Zwischenbuffers (Array) dramatisch reduzieren ![]() also lockbuffer read alle werte-> wenn passend eintrag ins array. unlockbuffer w1 . lockbuffer w2, writepixelfast alle gesetzten werte im array, unlockbuffer. fertig |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Bigmichi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke schonmal aber Ctuchik dein Vorschlag wäre weniger schreibarbeit aber sehr viel speed bekomm ich dadurch auch net ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du machst derzeit eine große schleife in der Du alle pixel abfragst ob sie denn rot sind. Dann schreibst du (wenn er Rot ist) in den anderen Buffer.
Mein Vorschlag war halt: Schleife 1 Bild durchgehen ob rot, wenn ja in Array (bild(1023,767)) speichern. schleife 2 Wenn Billd(x,y)=1 dann writepixelfast bild2,x,y Wie ichs halt oben gesagt hab. Hat den Vorteil dass nur 2 mal der Buffer gewechselt werden muss (anstatt 1024*768*2 mal) |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Bigmichi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Super Idee =) Danke hab zwar och net getestet wird aber gehen hoff ich doch =) Genial =) | ||
![]() |
Garfield |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hatte den Code auch schon so umgeschrieben wie ich das meinte.
Der Buffer wird nun auch NUR beim Erkennen eines roten Pixels gewechselt. Das dürfte schon mal ordentlich Zeitersparnis bringen |
||
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra |
![]() |
Bigmichi |
![]() Antworten mit Zitat ![]() |
---|---|---|
So hab es nun getesttet hab nun erstmal dne Vorschlag vonBladerunenr genommen ... Garfield dein code versteh ich irgendwie nicht da wird auch ständig der buffer gewechselt deswegen weiß ichnciht ob es wirklich zeit spart...
so hab nun eien neue function sie wandelt das bild innerhalb von 2,5 Sek um =) Code: [AUSKLAPPEN] FUNCTION DrawFeld()
DEBUGLOG "Start" W2 = createimage(1024,738) ;Texturwand drawimage BildBittewarten,1024/2,768/2 flip TT = MILLISECS() setbuffer Imagebuffer(W1) lockbuffer imagebuffer(w1) FOR XX = 0 TO 1024 FOR YY = 0 TO 740 F1 = readpixelfast(XX,YY+T) r=(F1 AND $FF0000)/$10000 g=(F1 AND $FF00)/$100 b=F1 AND $FF IF R = 255 AND G = 0 AND B = 0 THEN BPunkte(XX,YY) = 1 NEXT NEXT unlockbuffer imagebuffer(W1) setbuffer Imagebuffer(BildKachel) lockbuffer imagebuffer(BildKachel) FOR XX = 0 TO 1024 FOR YY = 0 TO 740 IF BPunkte(XX,YY) = 1 THEN BPunkte(XX,YY) = readpixelfast(XX,YY) NEXT NEXT unlockbuffer imagebuffer(BildKachel) setbuffer Imagebuffer(W2) lockbuffer imagebuffer(W2) FOR XX = 0 TO 1024 FOR YY = 0 TO 740 IF BPunkte(XX,YY) <> 0 THEN writepixelfast(XX,YY,BPunkte(XX,YY)) NEXT NEXT unlockbuffer imagebuffer(W2) DEBUGLOG "Fertig" DEBUGLOG MILLISECS() - TT setbuffer backbuffer() Vorschau = 1 END FUNCTION Gibt es noch Verbesserungsvorschläge ? |
||
![]() |
Garfield |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schon mal sehr gut so,
ich würde mit Types arbeiten und nur dann ein Datenfeld erzeugen, wenn auch ein roter Pixel gefunden wurde. Dann brauchst du nicht immer 1024 x 748 Durchläufe zu machen sondern nur soviel wie es auch rote Pixel gibt am Anfang: Code: [AUSKLAPPEN] Type RotPunkt
field x field y end type Bedingung: Code: [AUSKLAPPEN] IF R = 255 AND G = 0 AND B = 0 THEN
RP.RotPunkt = new RotPunkt RP\x = XX RP\y = YY end if Ausführung: Code: [AUSKLAPPEN] for RP.RotPunkt = each RotPunkt
deinen Code hierher next |
||
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra |
![]() |
Bigmichi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gute Idee =) so fällt das lästige überprüfen ob der leeren Pixel =) probier ich mal aus =) | ||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bevor es noch zum Bluescreen kommt:Code: [AUSKLAPPEN] FOR XX = 0 TO 1024 Solange y nur bis 740 läuft wirds wohl keine Probleme machen, außer das die Berechnungen oder was auch immer nicht stimmen könnten. Wenn das beabsichtigt ist: Auf den Scheiterhaufen mit dem Ketzer! ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
hätte noch ne einfachere gefunden:
Kopiere das zu Prüfende Bild in ein Neues image, welches Doppelt so breit ist wie das Original (also bei Dir : 2048*768). Dann in einer Schleife die linke Bildhälfte nach roten Pixeln durchsuchen. Wird einer gefunden: roter punkt auf koord: 1024+x,y speichern. Zum Abschluss: Rechte Bildhälfte in neues image Kopieren. Nur noch ein LockBuffer, und Copybefehle sind sehr schnell. ![]() ![]() EDIT: Funktioniert allerdings so nur, wenn Deine Monitor-/GraKa-Kombi eine entsprechend hhe Auflösung zur Darstellung des "Doppelbildes" zulassen. Ansonsten müsstest Du dein Bild in zwei Halbschritten berechnen, also linke Hälfte kopieren, berechnen, rüberkopieren. Dann rechte Hälfte ebenso. Hat auch den Vorteil dass du zugucken kannst *grin* |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Bigmichi |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich versteh nicht ganz wieso davon soviel speed rauskommen soll ? ob er alles auf einmal oder 2 mal die hälfte ? ich kann dir leider nicht folgen ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du sparst dir das Anlegen und Abfragen des arrays. Die copyimagerect-Geschichte ist sehr schnell... Sicher keine Riesenersparnis, aber bemerkbar sollte es sein.
Kann nur ausprobieren empfehlen. (bin grad auf der Arbeit, da kann ich das nicht testen). |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Bigmichi |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich weiß imme rnoch net wie du dir das vorstellst ![]() |
||
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich würd gern wissen wozu das eigentlich dient!
Weil wenn das rote Bild sozusagen eine Maske für das andere Bild darstellt und nur diese Pixel dann farbig bleiben sollen und der Rest schwarz, dann kann man die Maske doch auch anders als als Bild speichern! Bei mir geht das jetzt in 133 Millisekunden, wenn das so gedacht ist! |
||
![]() |
Bigmichi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ctuchik kannst dur mir einBsp schicken ? ich verstehe nicht wie du das meinst ![]() Also ich brauche ein Rutine ich hab 3 Bilder =) 1 Bild ist gekachelt und ist das Bild wo die Pixel raus sollen 1 Bild das Rot bleibt also nur zum lesen gedacht ist und dan noch 1 Bild wo dan die Pixel gesetzt werden wenn du eine schnellere möglichkeit hast zeig sie mir bitte 133 ms wären sehr erstaunlich und vllt dan auch für realtime zu verwenden =) |
||
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wird das Originalbild hinterher noch benötigt und es muss zwangsweise ein neues Bild erstellt werden?
Oder reicht es, wenn man die Pixel die nicht rot sind im alten Bild schwarz macht? Ich bring gleich nen Code muss das nur nochmal überarbeiten! |
||
![]() |
Bigmichi |
![]() Antworten mit Zitat ![]() |
---|---|---|
also das Bild wo die Pixel gesetzt werden erstelle ich beim funktionsaufruf ich brauch beide Bilder einmal das rote und einmal das wo die Pixel gesetzt werden das Kachelbild ist immer geladen aber wichtig ist es beide also rot und das gesetzte Pixelbild zu haben =) | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group