MirrorImage() - 56 mal schneller als ScaleImage()

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Kekskiller

Betreff: MirrorImage() - 56 mal schneller als ScaleImage()

BeitragFr, Aug 06, 2004 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mal ne gaaaaanz kleine Bildspiegelfunktion gebaut.
Ok, ist eigentlich vollkommen einfach zu machen, abr naja...
Tada:
BlitzBasic: [AUSKLAPPEN]
Function MirrorImage(image,flag)
copy=CopyImage(image)
imgw=ImageWidth(image)
imgh=ImageHeight(image)
src=ImageBuffer(copy)
dest=ImageBuffer(image)
Select flag
Case 1
For z=0 To imgh-1
CopyRect 0,z,imgw,1,0,(imgh-1)-z,src,dest
Next
Case 2
For z=0 To imgw-1
CopyRect z,0,1,imgh,(imgw-1)-z,0,src,dest
Next
End Select
End Function

Das Bild wird direkt auf dem Buffer geändert. Wie RotateImage(),
nur eben recht fix ^_^ . Geht eigentlich auch ganz gut für größere Bilder,
müsst ihr selbst mal ausprobieren, obs schnell genug ist. Aber bitte
erst vorberechnen, kein RealTime-Teil. Obwohlvorberechnen eigentlich
nicht das richtige Wort dafür ist, besser ist vorspiegeln.
  • Zuletzt bearbeitet von Kekskiller am Sa, Aug 07, 2004 18:15, insgesamt einmal bearbeitet
 

Ballermann99

BeitragFr, Aug 06, 2004 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Man könnte natürlich auch ScaleImage img, -1, 1 bzw ScaleImage img, 1, -1 benutzen Wink . Da muss man nur den Bezugspunkt wieder auf 0, 0 setzen (HandleImage img, 0, 0). Aber sonst funzt deine Routine ja ganz gut Smile . Hab jetzt nicht getestet, was schneller is.

MfG Ballermann99
 

Kekskiller

BeitragFr, Aug 06, 2004 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Oller Spielverdeber Smile .
Aber ScaleImage() ist doch eine dieser "bösen Funktionen" Wink ...
 

Ballermann99

BeitragFr, Aug 06, 2004 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Was heißt böse? ^^
Für Realtime kann ma sie nicht benutzen, stimmt, aber man kann ja vorberechnen.
 

Kekskiller

BeitragFr, Aug 06, 2004 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Na die "bösen" Dinger sind bei immer die ust lahmen Teile ^_^ .
Aber meines ist sicher auch nicht schneller...
Habs aber auch nicht mal ausprobiert, da ich in Sachen Speed-Tests nicht
so ein Experte bin.
 

Ballermann99

BeitragFr, Aug 06, 2004 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab den Speed mal grad getestet. Mit deiner Routine dauert es 20 ms und mit ScaleImage() 1120ms bei einem Bild 800*600 Shocked

Das is schon ein unterschied Smile

Mr.Keks

BeitragSa, Aug 07, 2004 11:29
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn man diese methode nur etwas erweitert, kann man damit scaleimage ersetzen... habe ich hier schon öfters gesehen.
MrKeks.net
 

Kekskiller

BeitragSa, Aug 07, 2004 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, cool, hätte ich nicht gedacht Smile . Das ist also ganze 56 mal schneller
als die andere Variante, werde es mal ins Blitzbasic.com-Code-Archiv stellen Wink .
Aber ScaleImage() ersetzen? Weiß nicht, da braucht es eine anders
aufgebaute Routine... Aber ne Idee wäre sowas sicher wert.
Obwohl ... Copyrect ist sicher keine schöne Verwendung für ganze
Rotationen, da ich Sinus für bräuchte. Und schneller wird es damit
sicher nicht. Belasse man es beim Spiegeln Very Happy .
 

Edlothiol

BeitragSa, Aug 07, 2004 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Global scratch = CreateImage(1600,1400)

Function DrawSizeBlock(image,x%,y%,w%,h%)
Local ih%=ImageHeight(image)
Local iw%=ImageWidth(image)

Local sw%=Abs(w)
Local sh%=Abs(h); - 1

Local xr#=Float(iw)/Float(sw)
Local yr#=Float(ih)/Float(sh)

fromimg=ImageBuffer(image)
toimg=ImageBuffer(scratch)

Local vf=-1+((h>0)*2)

Local fw=(w<0)*w
Local fh=(h<0)*h

If w>=0
For ix=0 To sw
CopyRect Floor(ix*xr),0,1,ih,ix,0,fromimg,toimg
Next
Else
For ix=0 To sw
CopyRect Floor(ix*xr),0,1,ih,sw-ix,0,fromimg,toimg

Next
EndIf


For iy=0 To sh
CopyRect 0,Floor(iy*yr),sw,1,x+fw,y+(iy*vf),toimg, GraphicsBuffer()
Next

End Function
Hab jetzt keinen Speedtest gemacht, aber das ist um einiges schneller als ScaleImage (allerdings natürlich nicht mit bilinearem Filtering). Und die Methode ist deiner relativ ähnlich. Wenn einen die globale Variable stört, kann man das Bild natürlich auch lokal in der Funktion erstellen lassen, dann muss es auch nicht so groß sein.
 

Kekskiller

BeitragSa, Aug 07, 2004 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Uh, verdammt, ich Göppel!
ScaleImage() war ja zum Skalieren da >_< ...
Ich dachte ihr meintet RotateImage() ^_^" ...
Deine Methode ist interessant, aber anscheinend für Realtime
ausgelegt. Ich würde das ganze auf ein Image auslegen, was
dann schnell vorbrechnet werden kann. Achja: Meine GraKa
verkraftet keine Bilder, welche größer als die Maximalauflösung
ist nicht Wink . Stell mal aus, wäre sicher interessant.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group