Problem mit Pixelberechnung

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

sbrog

Betreff: Problem mit Pixelberechnung

BeitragMi, Sep 01, 2004 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi. Ich wollte mal so ein Programm machen, welches ein Bild langsam in ein zweites verwandelt(in diesem fall ein rotes in ein blaues rechteck). Dazu habe ich für jede Farbe ein Array erstellt (insgesamt also 6, weil 2 Bilder), und 3 Arrays für die Unterschiede der einzelnen Pixel. Um das Bild dann langsam in das andere übergehen zu lassen , addiere ich zu den Pixeln von Bild 1 jeweils den Unterschied/10, sodass das Bild sich in 10 durchläufen in das andere verwandelt.

Leider klappt das ganz und gar nicht.(Sorry, ging leider nicht kürzer)
Code: [AUSKLAPPEN]

;Ein Bild langsam zu einem anderen übergehen lassen

Graphics 400,300,32


;Die informationen von Bild 1
Dim rot1#(400,300)
Dim gruen1#(400,300)
Dim blau1#(400,300)
;Die Informatieonen von Bild 2
Dim rot2(400,300)
Dim gruen2(400,300)
Dim blau2(400,300)
;Differenzen der Pixelfarben
Dim rotdif#(400,300)
Dim gruendif#(400,300)
Dim blaudif#(400,300)



bild1 = CreateImage(400,300)
bild2 = CreateImage(400,300)




;Bild 1 einlesen
SetBuffer ImageBuffer(bild1)
Color 255,0,0   
Rect 0,0,300,400,1               ;Bild 1 ist ein rotes Rechteck

LockBuffer ImageBuffer(bild1)
For i = 0 To 400
   For j = 0 To 300
   
       rgb = ReadPixel(i,j)
      rot1(i,j)   =(rgb And $FF0000)/$10000   ;Rot einlesen
      gruen1(i,j) =(rgb And $FF00)/$100       ;Grün einlesen
      blau1(i,j)  =rgb And $FF                ;Blau einlesen
      

   Next
Next
UnlockBuffer ImageBuffer(bild1)


;Bild 2 einlesen
SetBuffer ImageBuffer(bild2)
Color 0,0,255
Rect 0,0,400,300,1                 ;Bild 2 ist ein Blaues rechteck

LockBuffer ImageBuffer(bild2)
For i = 0 To 400
   For j = 0 To 300
   
       rgb = ReadPixel(i,j)
      rot2(i,j)   =(rgb And $FF0000)/$10000  ;Rot einlesen
      gruen2(i,j) =(rgb And $FF00)/$100      ;Grün einlesen
      blau2(i,j)  =rgb And $FF               ;Blau einlesen
      

   Next
Next
UnlockBuffer ImageBuffer(bild2)




;Die differenzen berechnen
For i = 0 To 400
   For j = 0 To 300
   
      rotdif(i,j) =Float rot1(i,j) -rot2(i,j)
      gruendif(i,j) =Float gruen1(i,j) -gruen2(i,j)
      blaudif(i,j) =Float blau1(i,j) -blau2(i,j)
   Next
Next



SetBuffer BackBuffer()

;Hauptschleife
Repeat
Cls
;Damit die Animationen nach 10 Läufen nicht noch weitergeht :
zaehler = zaehler + 1 : If zaehler = 10 Then SetBuffer FrontBuffer():Cls:Text 0,0,"Animation abgespielt":WaitKey:End
 
LockBuffer BackBuffer()

For i = 0 To 400
   For j = 0 To 300
   
   WritePixel i,j,blau1(1,1) Or (gruen1(1,1) Shl 8) Or (rot1(1,1) Shl 16)   ;Das Bild einzeichnen
   ;Jedes Pixel um Differenz/10 erhöhen
   ;nach 10 durchläufen sollte Bild 2 vollständig sein
    rot1(i,j)    =Float rot1(i,j)+rotdif(i,j)/10                             
    gruen1(i,j) =Float gruen1(i,j) + gruendif(i,j)/10
    blau1(i,j)  =Float  blau1(i,j)+blaudif(i,j)/10
   
   
   Next
Next
UnlockBuffer BackBuffer()

Delay 300

Flip
Until KeyHit(1)

sbrog

BeitragDo, Sep 02, 2004 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Würdet ihr es eventuell ganz anders machen ?
 

Timo

BeitragDo, Sep 02, 2004 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
du brauchst nicht jeden Farbwert in ein Array speichern, vielmehr solltest du eine Variable (z.B. namens "Alpha") verwenden. diese Zahl soll dann Werte zwischen 0 und 1 annehmen. Wenn es genau 0 ist wird nur das erste Bild gezeichnet, wenn es 1 ist das andere.

Durch diesen Alpha-Wert kannst du dann prozentual berechnen, wie stark jedes Bild zu sehen ist...

Code: [AUSKLAPPEN]
Neu_Rot =   Int(Bild1_Rot * Alpha + Bild2_Rot * (1 - Alpha))
Neu_Gruen = Int(Bild1_Gruen * Alpha + Bild2_Gruen * (1 - Alpha))
Neu_Blau =  Int(Bild1_Blau * Alpha + Bild2_Blau * (1 - Alpha))


Das musst du nur mit jedem Pixel machen und das wiederum in jedem Frame... das Bild darf also nicht zu groß sein. Am besten du verwendest dafür writepixelfast und readpixelfast Wink

sbrog

BeitragDo, Sep 02, 2004 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich es mit jedem Pixel machen muss, dann muss ich die Werte ja auch wieder in einem Array speichern
 

Timo

BeitragDo, Sep 02, 2004 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
nein, dein Array ist dein Imagecontainer... und dafür soll ReadpixelFast herhalten...

sbrog

BeitragDo, Sep 02, 2004 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Also so ganz kapiere ich das immer noch nicht.

du mienst ich soll bild2 über bild 1 malen, bild 1 am anfang mit1 alpha und bild2 mit 0 alpha und dann in jedem durchlauf den alpha von bild1 erhoehen und von bild2 verringern ?[/code]
 

Timo

BeitragDo, Sep 02, 2004 12:27
Antworten mit Zitat
Benutzer-Profile anzeigen
nein nicht ganz, du hast nur eine Variable "alpha" und wenn die 0 ist zeichnest du automatisch nur das eine Bild ein und wenn "alpha" 1 ist zeichnest du automatisch nur das andere Bild ein. Wenn "alpha" zwischenwerte erhält gibt es übergänge. Bei 0.5 werden zum Beispiel beide gleich stark gezeichnet.
Ich versuch mal kurz ein Beispiel zu programmieren, kann aber etwas dauern Smile

sbrog

BeitragDo, Sep 02, 2004 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
du meinst, dass ich dann eine Formel schreibe, die aus Alpha den alphawer für die beiden Bilder berechnet ?

ginge das nicht auch so ?
Code: [AUSKLAPPEN]

for i = 0 to bildbreite
for j = 0 to bildhoehe

rgb = readpixelfast
a=(rgb AND $FF000000)/$1000000
r=(rgb AND $FF0000)/$10000
g=(rgb AND $FF00)/$100
b=rgb AND $FF

a=a + 1    ;alphawert erhoehen, bei bild 2 verringern

rgb=a*$1000000 + r*$10000 + g*$100 + b

writepixelfast i,j,rgb

next
next
  • Zuletzt bearbeitet von sbrog am Do, Sep 02, 2004 12:32, insgesamt einmal bearbeitet
 

Timo

BeitragDo, Sep 02, 2004 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
nee auch nicht, kleinen Moment, dann schick ich mal n beispiel

sbrog

BeitragDo, Sep 02, 2004 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
hab oben was ergänzt
 

Timo

BeitragDo, Sep 02, 2004 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
so ähnlich, aber WARTS AB!! Wink
 

Timo

BeitragDo, Sep 02, 2004 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du den Debugger ausmachst, siehts schöner aus Wink Ich hab jetzt einfach mal ein grünes Bild und ein blaues gemacht, können natürlich auch andere Bilder sein...

Code: [AUSKLAPPEN]
Graphics 800,600,32,2

Local Alpha#,x,y
Local Neu_Rot,Neu_Gruen,Neu_Blau
Local Neu_cl,Bild1_cl,Bild2_cl ; Farb_Hex Werte

Bild1 = CreateImage(200,200)
Setbuffer Imagebuffer(Bild1)
  Color 0,255,0
  Rect 0,0,200,200
  Lockbuffer
Bild2 = CreateImage(200,200)
Setbuffer Imagebuffer(Bild2)
  Color 0,0,255
  Rect 0,0,200,200
  Lockbuffer
 
Setbuffer Backbuffer()

Repeat
cls
if keydown(203) then alpha# = alpha# - 0.03
If keydown(205) Then alpha# = alpha# + 0.03

If alpha# > 1 then alpha# = 1
If alpha# < 0 then alpha# = 0


Lockbuffer
For y = 0 to 199
  for x = 0 to 199
    Bild1_cl = ReadPixelFast(x,y,Imagebuffer(Bild1))
    Bild2_cl = ReadpixelFast(x,y,IMagebuffer(Bild2))
   
    Neu_Rot =   Int(((Bild1_cl AND $FF0000)/$10000) * Alpha + ((Bild2_cl AND $FF0000)/$10000) * (1 - Alpha))
    Neu_Gruen = Int(((Bild1_cl AND $FF00)/$100) * Alpha + ((Bild2_cl AND $FF00)/$100) * (1 - Alpha))
    Neu_Blau =  Int((Bild1_cl AND $FF) * Alpha + (Bild2_cl AND $FF) * (1 - Alpha))
   
    Neu_cl = $FF000000 + Neu_Rot*$10000 + Neu_Gruen*$100 + Neu_Blau
    WritePixelFast x,y,Neu_cl
  next
next
Unlockbuffer



Text 230,20,"alpha# = " + alpha#
Text 230,40,"Benutze die Pfeiltasten, um den alphawert zu ändern!!"
Flip
Until Keyhit(1)
 
  • Zuletzt bearbeitet von Timo am Do, Sep 09, 2004 16:04, insgesamt einmal bearbeitet

sbrog

BeitragDo, Sep 02, 2004 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Obwohl du ein blaues bild in den Buffer zeichnest, erscheint bei mir ein schwarzes, wenn sich der alphawert 0 nähert. Außerdem hat mein BB irgendwelche probleme mit diesen Pixelgeschichten. Nach der Programmausführung stürzt es immer ab.
  • Zuletzt bearbeitet von sbrog am Do, Sep 02, 2004 13:03, insgesamt einmal bearbeitet

Ctuchik

BeitragDo, Sep 02, 2004 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schön Smile !
Aber warum is bei mir des erste Bild nur blau, wenn ich den Debugger ausmach???
Wenn der Debugger an ist verläufts von Schwarz in Grün!
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!
 

Timo

BeitragDo, Sep 02, 2004 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
och nö, das kann doch nicht sein oder Sad
Naja, soll aber nur ein Beispiel sein und ich hoffe es zeigt wie ichs meinte Smile

sbrog

BeitragDo, Sep 02, 2004 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab mal was mit alphawerten probiert (ist heute das erste mal, dass ich mich damit befasse). Klappt aber nicht so ganz. ich zeichne ein Rotes quadrat mit Alphawert 255 . Wenn man den Wert aber mit readpixel einliest, dann ist der Wert -1

Code: [AUSKLAPPEN]

Graphics 800,600

bild = CreateImage (400,300)
SetBuffer ImageBuffer(bild)

LockBuffer
For i = 0 To 400
   For j = 0 To 300
   
   WritePixel i,j,$FFFF0000  ;Das ganze Bild wird mit Roten pixeln gezeichnet und dem Alphawert 255
   
   Next
Next
UnlockBuffer



   
   
 




 


SetBuffer FrontBuffer()

DrawImage bild,0,0
;Das erste PIxel lesen
rgb = ReadPixel (1,1)

alpha=(rgb And $FF000000)/$1000000     
rot=(rgb And $FF0000)/$10000
gruen=(rgb And $FF00)/$100
blau=rgb And $FF

Text 410,100,alpha    ;sollte 255 sein

WaitKey

 

Timo

BeitragDo, Sep 02, 2004 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
stimmt, merkwürdig!
Bei mir hat es gefunzt, als ich bei beiden eine 0 gestrichen hab

Code: [AUSKLAPPEN]
alpha=(rgb And $FF0000)/$10000


aber warum, weiß ich auch nicht, denn es ist ja eigentlich falsch Rolling Eyes

Erst hatte ich es früher auch mal versucht, mit dem Alphawert der Farben etwas transparent darzustellen. Aber irgendwie funzt das nicht (auch nicht in B3d) Drum frag ich mich wozu man überhaupt den Alphawert dann abspeichern soll Rolling Eyes

[EDIT]
Darüber gibts auch gerade nen netten Thread --> https://www.blitzforum.de/viewtopic.php?t=5578

sbrog

BeitragDo, Sep 02, 2004 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Dass es bei dir funktioniert ist zufall. Denn Alpha wird dann berechnet wie rot . Und rot hat in diesem Bild auch 255 Wink
 

Timo

BeitragDo, Sep 02, 2004 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
shit hast recht! Hab nicht aufgepasst Embarassed

sbrog

BeitragDo, Sep 02, 2004 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber eigentlich sollte der Code mit dem Alpha doch funktionieren, oder ?

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group