Problem mit Pixelberechnung
Übersicht

![]() |
sbrogBetreff: Problem mit Pixelberechnung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Würdet ihr es eventuell ganz anders machen ? | ||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn ich es mit jedem Pixel machen muss, dann muss ich die Werte ja auch wieder in einem Array speichern | ||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nein, dein Array ist dein Imagecontainer... und dafür soll ReadpixelFast herhalten... | ||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nee auch nicht, kleinen Moment, dann schick ich mal n beispiel | ||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
hab oben was ergänzt | ||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
so ähnlich, aber WARTS AB!! ![]() |
||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn du den Debugger ausmachst, siehts schöner aus ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sehr schön ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
och nö, das kann doch nicht sein oder ![]() Naja, soll aber nur ein Beispiel sein und ich hoffe es zeigt wie ichs meinte ![]() |
||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ![]() [EDIT] Darüber gibts auch gerade nen netten Thread --> https://www.blitzforum.de/viewtopic.php?t=5578 |
||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dass es bei dir funktioniert ist zufall. Denn Alpha wird dann berechnet wie rot . Und rot hat in diesem Bild auch 255 ![]() |
||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
shit hast recht! Hab nicht aufgepasst ![]() |
||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber eigentlich sollte der Code mit dem Alpha doch funktionieren, oder ? | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group