Stufenlose Größenänderung von Bildern - Realtime and Fast :) von Triton |
Folgender Code kann Bilder stufenlos vergrößern und verkleinern und ist ziemlich schnell dabei :-) Man brauch nur den Code kopieren, irgentein Bild angeben (nicht zu groß, am besten ist es bei 300x100 ca.) und kann dann mit linker Maustaste das Bild größer werden lassen, mit rechter Maustaste kleiner und mit beiden wird angehalten. [code:1:23f4846e49] ;Stufenlose Vergrößerung und Verkleinerung von Bildern ;3/4.11.2002 by Triton ;http://www.blitz-basic.ch.vu ;dieser Resize-Effekt kann Bilder nur Prozentual in der Größe ändern! Graphics 640,480,16,1 SeedRnd MilliSecs() Delay 1000 pic = LoadImage("hlboa.jpg") aender# = 0.01 ;Größenänderung jedes Einzelbildes später (1 = +/- 100%) groessex = ImageWidth(pic) groessey = ImageHeight(pic) Dim pixel#(groessex-1,groessey-1,1) Dim pixel2#(groessex-1,groessey-1) ;*** Farben vom Ursprungsbild einlesen SetBuffer ImageBuffer(pic) LockBuffer ImageBuffer(pic) DrawBlock pic,0,0 For scanx = 0 To ImageWidth(pic)-1 For scany = 0 To ImageHeight(pic)-1 pixel2#(scanx,scany) = ReadPixelFast(scanx,scany) Next Next UnlockBuffer ImageBuffer(pic) ;pixel erstmal simpel mit x,y füllen, diese Koordinaten für die pixel werden dann später verändert SetBuffer BackBuffer() For x = 0 To groessex-1 For y = 0 To groessey-1 pixel#(x,y,0) = x pixel#(x,y,1) = y Next Next t=MilliSecs() fps=999 While Not KeyDown(1) If MouseDown(1) Then on = 1 If MouseDown(2) Then on = 0 If MouseDown(1) And MouseDown(2) Then on = 2 LockBuffer BackBuffer() For x = 0 To groessex-1 For y = 0 To groessey-1 x2 = pixel#(x,y,0) y2 = pixel#(x,y,1) If x2 > 0 And x2 < GraphicsWidth() And y2 > 0 And y2 < GraphicsHeight() Then WritePixelFast x2,y2,pixel2#(x,y) If on = 0 Then pixel#(x,y,0) = pixel#(x,y,0)*(1-aender#) ;Faktor der X-Veränderung bei jeden Frame pixel#(x,y,1) = pixel#(x,y,1)*(1-aender#) ;das gleiche mit Y End If If on = 1 Then pixel#(x,y,0) = pixel#(x,y,0)*(aender#+1) ;nochmal das gleiche, jetzt wirds aber größer pixel#(x,y,1) = pixel#(x,y,1)*(aender#+1) End If If on = 2 Then pixel#(x,y,0) = pixel#(x,y,0)*1 ;x1, d.h keine Größenänderung pixel#(x,y,1) = pixel#(x,y,1)*1 End If Next Next UnlockBuffer BackBuffer() a=a+1 If MilliSecs()-t>1000 Then fps = a a = 0 t = MilliSecs() End If Color 255,255,255 ms# = 100/fps Text 0,0,fps+" fps | "+ms#+" ms | "+ (pixel#(x,y,0) Mod pixel#(x+1,y+1,0))+" Size" Flip Cls Wend End[/code:1:23f4846e49] |
von ??? |
Gefällt mir gut der Effekt. Dirk Knoop |
von ??? |
Bei mir legt sich bei der Vergößerung ein Gitter über das Bild, was nach und nach zu schwarzen Punkten wird. Das war wohl nicht im Sinne des Erfinders oder :( |
von ??? |
Naja, schon, aber man kann ja mit Rects die Zwischenräume ausmalen lassen. Wenn die Größe des Bildes über 100% geht. Habs nur nicht machen wollen, weil sonst der Speed in die Knie geht. |
BOA!!! von ??? |
Diese Funktion war so langsam, dass ich meinen Computer geresetet habe (weil das Bild nach 5 Minuter erst bei 50% skaliert war und ein Neustart viel schneller gewesen ist) - habe blöderweise ein großes Bild genommen... Hier ECHTE Realtime-Skalierung: http://www.blitzforum.de/viewtopic.php?p=15409#15409 |
von ??? |
@TheShadow & @Triton: Ich weiß, dass ihr gerne darum kämpft besser zu sein, aber: Der BlitzBasic Wettbewerb hat immer noch nicht angefangen. 8) MfG ShadowTurtle |
von ??? |
sicher, dass du Debug aus hattest?? ;) In der Regel ist es sehr schnell. Ich muss mal ne optimierte Version schreiben... :evil: :wink: |
von ??? |
weiß nicht mehr - musste ja Rechner Neustarten Bei meiner Methode läuft es selbst im Debugmodus schnell... vielleicht kannst du copypixelfast nehmen? |