Bild um den Mittelpunkt drehen?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

SlasHeR

Betreff: Bild um den Mittelpunkt drehen?

BeitragMi, Jun 21, 2006 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich hab nen kleines Problem.

Ich möchte gerne ein Bild drehen.
Dazu habe ich die Funktion RotateImage(bild, grad)

um es z.b. auf den Kopf zu drehen: RotateImage(bild,180)

Dabei ist mir allerdings aufgefallen, dass es sich um den Punkt (0,0) dreht, und nicht um den Mittelpunkt des Bildes?
Kann ich das irgendwie ändern?

TFormImage?! *keine Ahnung*
Wäre euch für ne kurzfristige Info sehr dankbar, hocke grade an nem netten Tool, was ich gern hier veröffentlichen würde Wink
 

Dreamora

BeitragMi, Jun 21, 2006 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
HandleImage
http://www.blitzbase.de/befehle2d/handleimage.htm

Alterativ gibts AutoMidHandle

Hoffe das ist kurzfristig genug Wink
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

SlasHeR

BeitragMi, Jun 21, 2006 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die superschnelle Antwort!
 

SlasHeR

BeitragMi, Jun 21, 2006 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm..
Angenommen ein Bild ist 64x64 pixel?

Wo ist dann die Mitte? 31,31? 32,32? 32,31?,31,32?
Das Problem was ich habe, das ich nach 2 maligen drehen um 180 grad Schwarze streifen an den Seiten habe Sad

Vincent

BeitragMi, Jun 21, 2006 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Vermeide es, einmal gedrehte Bilder weiter zu drehen.
Speichere lieber das Ausgangsbild, und drehe es bei Bedarf halt um einen anderen Winkel, um das weitergedrehte Bild zu erhalten.
Gott ist nicht mit uns ... weil er mit Idioten keine Gnade kennt !

Rone

BeitragMi, Jun 21, 2006 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

benutze zusätzlich "TFormFilter 0" , dann hast du das Problem mit den Streifen nicht..

Außerdem würde ich das Bild nicht während des Spiels drehen, sondern vorher und in einem Animationsstreifen oder Array speichern (schneller)...

Und schau mal hier:

https://www.blitzforum.de/foru...highlight=

https://www.blitzforum.de/foru...ght=rotate

mfg

D2006

Administrator

BeitragMi, Jun 21, 2006 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Is ja wohl mal voll 2D Wink

~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.

MfG
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

SlasHeR

BeitragMi, Jun 21, 2006 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
TFormFilter 0 ist bereits Bestandteil meines Codes (hab alle Seiten zu den Handles auf BlitzBase gelesen...)
Streifen habe ich dennoch.

Das Problem ist, ich muss das Bild zwangsweise 2mal drehen.

Ob das länger dauert oder nicht ist nicht relevant, da es sich um ein Tool handelt, was ruhig etwas länger brauchen kann. Viel wichtiger ist das es exakt aussieht, und keine Fehler entstehen.

Wenn jetzt niemand noch nen entscheiden rat hat, bleibt mir wohl nichts anderes, als eine eigene Funktion zu schreiben, die das Drehen des Bildes übernimmt.

Das wäre nicht allzuschlimm, da ich nur 90,180,270 grad brauche, und das mit jeweils 2 for-Schleifen erledigen könnte.

Nur ist das vielleicht nicht allzu elegant. Sad

Rone

BeitragMi, Jun 21, 2006 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also,
wenn du es so machst wie in den o.g. Links, dann geht es auf jeden fall:

Code: [AUSKLAPPEN]

Graphics 640,480,16

grund=CreateImage(64,64)
SetBuffer ImageBuffer(grund)
Color 0,0,222
Rect 0,0,64,64

ClsColor 200,0,0
timer = MilliSecs()+30

zeilen = 19
spalten =19
frames = zeilen *spalten
img= Rotate(grund,zeilen,spalten);,"test2.bmp")

SetBuffer BackBuffer()

While Not KeyHit(1)=1
   Cls
   DrawImage img ,290,200,i
   If MilliSecs()>timer Then
      timer = MilliSecs()+10
      If KeyDown(205) Then
         i=i+1
         If i>frames-1 Then i=0
      ElseIf KeyDown(203) Then
         i=i-1
         If i<0 Then i=frames-1
      EndIf
   EndIf
   Flip
Wend
End

Function Rotate(grund,zeilen,spalten,Datei$="temp.bmp")
   size = ( ImageWidth(grund)^2 +ImageHeight(grund)^2 )^0.5 
   HandleImage(grund,ImageWidth(grund)/2 ,ImageHeight(grund)/2)
   neu2=CreateImage(size*spalten,size*zeilen)
   TFormFilter 0
   SetBuffer ImageBuffer(neu2)
   For ty=0 To zeilen-1
      For tx=0 To spalten-1
         bild=CopyImage(grund)
         RotateImage bild,Float(tx+spalten*ty)*(360.0/(spalten*zeilen))
         DrawImage bild,size/2+tx*size,(size/2)+size*ty
         FreeImage bild
      Next
   Next
   SaveBuffer (ImageBuffer(neu2),Datei$)   
   Return (LoadAnimImage(Datei$,size,size,0,spalten*zeilen))
End Function



Alternativ kannst du die bilder auch in ein Array tun oder was auch immer, muss man ja nicht unbedingt speichern...

mfg
 

SlasHeR

BeitragDo, Jun 22, 2006 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ich bins nochmal!
Danke für eure Hilfe und Feedback!
Ist echt nen 1A Forum hier!

Ich habe leider immernoch die Probleme gehabt, wie beschrieben.
Kurios. Vielleicht lags daran, dass die Bilder im 64x64 großen buffer, selbst 64x64 groß waren, ich weis es nicht. :/


Hab mir daher was eigenes gebastelt, was zeitlich auch ausreicht. Smile

Falls jemand noch verwendung dafür haben sollte, hab ich mal die Funktion hier mit beigelegt.

Code: [AUSKLAPPEN]

Function RotateImageTile(sourceImage,destImage,winkel)
   ; simple rotate function for 64x64 tiles
   ; by SlasHeR
   
   LockBuffer ImageBuffer(sourceImage)
   LockBuffer ImageBuffer(destImage)
   
   If (winkel = 90) Then
   
      For y = 0 To 63
         For x = 0 To 63
            Pixel = ReadPixelFast( x,y,ImageBuffer(sourceImage))
            WritePixelFast( 63-y, x, Pixel, ImageBuffer(destImage))
         Next
      Next
      
   ElseIf (winkel = 180) Then

      For y = 0 To 63
         For x = 0 To 63
            Pixel = ReadPixelFast( x,y,ImageBuffer(sourceImage))
            WritePixelFast( 63-x, 63-y, Pixel, ImageBuffer(destImage))
         Next
      Next

   ElseIf (winkel = 270) Then
   
      For y = 0 To 63
         For x = 0 To 63
            Pixel = ReadPixelFast( x,y,ImageBuffer(sourceImage))
            WritePixelFast( y, 63-x, Pixel, ImageBuffer(destImage))
         Next
      Next
      
   End If
   
   UnlockBuffer ImageBuffer(sourceImage)
   UnlockBuffer ImageBuffer(destImage)
   
   If ((winkel = 0) Or (winkel = 360)) Then
      CopyRect 0,0, 64, 64, 0, 0, ImageBuffer(sourceImage), ImageBuffer(destImage)
   End If
   
   
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group