Pixelumwandlung

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Bigmichi

Betreff: Pixelumwandlung

BeitragMi, Mai 26, 2004 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad

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

BeitragMi, Mai 26, 2004 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 26, 2004 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragMi, Mai 26, 2004 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
1. writepixelfast statt Plot.
2. Die Anzahl an Lockbuffer() durch verwenden eines Zwischenbuffers (Array) dramatisch reduzieren Wink -->seeeehr langsamer Befehl
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

BeitragMi, Mai 26, 2004 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke schonmal aber Ctuchik dein Vorschlag wäre weniger schreibarbeit aber sehr viel speed bekomm ich dadurch auch net Sad und dsa mit dem zuvielen locks kann gut stimmen =) der Vorschlag von Garfield weiß ich nicht so wirklich wie ich den verwirklichen soll udnob der was bringt aber der Vorschlag von Bladerunner wäre bestimmt sehr gut könntest du vielleicht noch mehr ins Detail gehen wie ich das machen sollte ?

BladeRunner

Moderator

BeitragMi, Mai 26, 2004 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 26, 2004 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Super Idee =) Danke hab zwar och net getestet wird aber gehen hoff ich doch =) Genial =)

Garfield

BeitragMi, Mai 26, 2004 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 26, 2004 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 26, 2004 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 26, 2004 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Gute Idee =) so fällt das lästige überprüfen ob der leeren Pixel =) probier ich mal aus =)

Hubsi

BeitragMi, Mai 26, 2004 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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! Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

BladeRunner

Moderator

BeitragDo, Mai 27, 2004 5:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Very Happy Wink

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

BeitragDo, Mai 27, 2004 7:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad

BladeRunner

Moderator

BeitragDo, Mai 27, 2004 8:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 27, 2004 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiß imme rnoch net wie du dir das vorstellst Sad könntest du mri vielleicht ein kleine code proggen wenn de wida daheim bist ?

Ctuchik

BeitragDo, Mai 27, 2004 16:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 27, 2004 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ctuchik kannst dur mir einBsp schicken ? ich verstehe nicht wie du das meinst Sad

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

BeitragDo, Mai 27, 2004 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 27, 2004 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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 =)

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group