Animiertes Image im Speicher erstellen und Speichern

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Bob

Betreff: Animiertes Image im Speicher erstellen und Speichern

BeitragMi, Jul 21, 2004 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,
ich brauch mal wieder eure Hilfe.

Aufgabe:
Ich habe ein Image (100 * 100 pixel).
Dieses muss in 360 Ansichten vorliegen (von 0 -359 Grad rotiert)
und soll dann in eine einzige BMP Datei gespeichert werden.
Ich kriege dies leider nicht ganz auf die Reihe.

Hier mein Lösungsansatz:
Ich erstelle mittels createImage(100*90,100*4) ein leeres Bild.
Das Bild soll also in 4 Zeilen bzw 90 Spalten angeordnet sein.
Dies ist wichtig weil eine BMP Datei eine bestimmte Größe (Breite / Höhe)nicht überschreiten darf. (Glaube ich zumindest. Bitte verbessern wen das nicht stimmt)

Das Ursprungsbild von 100*100 wird dann um den entsprechenden Winkel rotiert. (Was kein Problem ist. Eine Kopie des Ursprungsbildes wird im Speicher gehalten und immer wieder neu verwendet sonst verwischt das rotierte Bild. Tformfilter ist auch an.)

Nun muss das so erstellte Bild in das Animationsbild eingefügt werden.
Dies bekomm ich nicht auf die Reihe.
Das Ausrechnen der Position für die Zielkoordinaten bereitet keine Probleme.
Allerdings weis ich nicht mit welchem Image Befehl (Draw, copy usw.)
das rotierte Bild in mein Anibild kopiert werden kann.

Das Fertige Bild soll dann abgespeichert werden (Auch kein Prob)


Danke für Antworten

P.S. Aus bestimmten Gründen (für diess Projekt) kommt es nicht in Frage
360 Einzelne Bilder zu erstellen un diese in ein Dim Feld zu Speichern.
Das ist nämlich kein Problem.
 

hot-bit

Gast

BeitragMi, Jul 21, 2004 12:37
Antworten mit Zitat
Hi,

einfach, das zur Rotation passende Image nehmen, und in ein Array speichern.

Dann die dazugehörigen Bilder des jeweiligen Winkels für die Darstellung nehmen.

Toni

Hubsi

BeitragMi, Jul 21, 2004 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Lösungsansatz ist ja schon nicht schlecht. CreateImage hat einen optionalen Parameter: frame (CreateImage(width,height,[frame]). ImageBuffer übrigens auch. Dann die rotierten Bilder in den entsprechenden Frame malen und tadaa Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

rambo256

BeitragMi, Jul 21, 2004 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bin gerade auch daran...
hab da noch ein kleines problem,doch seht selbst...

Code: [AUSKLAPPEN]

;Imagerotieren + in EIN *.bmp-file abspeichern

Global Winkel
Global Image_dateiname$
Global Image_Datei
Global Image_Width
Global Image_Height

Dim Image(0,360)



Locate 250,200
Text 100,200,"Name des Bildes: "
Image_Dateiname$ = Input$()



Graphics 800,600,22,2

SetBuffer BackBuffer()
TFormFilter 2

Image_Datei = LoadImage(Image_Dateiname$+".bmp")
Image_width = ImageWidth(Image_Datei)
Image_height = ImageHeight(Image_Datei)

MaskImage Image_datei, 255,0,255

ClsColor 255,0,255
Cls

Image_rotieren(Image_datei,Image_width,Image_height)



Function Image_rotieren(Image_dateiname$,Image_Width,Image_height)





For i = 1 To 360

   width = width+1
   
   If width >= (800/image_width) Then
      width = 0
      height = height+1
   EndIf
   
   
   Image(0,i) = CopyImage(Image_dateiname$)
   RotateImage Image(0,i),i
   
   
   DrawImage Image(0,i),width*(image_width+(Cos(i)*(image_width/2))),height*(image_height+(Sin(i)*(image_height/2)))

Next

SaveBuffer(BackBuffer(),"test.bmp")

WaitKey
End Function 
Asus F53z

Das Leben ist eine reine Konkatenation...

Bob

BeitragMi, Jul 21, 2004 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Hubsi,

das ImageBuffer auch eine Frame Option hat ist mit tatsächlich neu.
Danke.
Nun bekomme ich nach etwas umschreiben des Codes zumindes auf dem Bildschirm (und natürlich im Speicher) das Ergebniss was ich erzielen wollte.
Die Sache zieht aber neue Probleme nach.

Erstelle ich ein Bild mit
myPic = createImage(100,100,360)
anstelle von
myPic = createImage(100*90,100*4)
kann ich es nicht Speicheren.
Der SaveImage Befehl gibt mir nicht das Ganze Image sondern nur ein Frame aus.
Der SaveBuffer Befehl ebenfalls.

Weiterhin weis ich ja auch nicht wie createImage(100,100,360)
das Bild intern verwaltet. Ich muss davon ausgehen das nur ein "Streifen " generiert wird, also alle Bilder nebeneinander.
Das funktioniert zwar im Ram / Monitor aber ich könnte das Bild nicht (funtionierend) Speichern da es zu groß ist.

Photoshop z.B. steigt bei 30.001 Pixel aus.
Erstelle ich mit bb ein Bild von 36000*100 Pixel, kann ist es kaputt.
Acdesse z.b. zeigt mir eine negative größe an.
Ich denke 30000 pixel ist die max Breite.
Ich muss also
myPic = createImage(100*90,100*4) verwenden.
Dann kann ich aber nicht mit Frames arbeiten.

Irgendwelche Ideen?

Bob

BeitragMi, Jul 21, 2004 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Rambo256
ich glaube das Problem ist das der BackBuffer immer so groß ist wie der Frontbuffer und dieser ist so groß wie in
Graphics eingestellt.

Verwende als Buffer einen ImageBuffer.
Ansonsten find ich den Lösungsansatz sehr gut.
Wenn wir unsere beiden "Dinger" kombinieren klappt es. Da bin ich sicher.

PS stehst du auf die 2? Wink



rambo256 hat Folgendes geschrieben:

Graphics 800,600,22,2

SetBuffer BackBuffer()
TFormFilter 2

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, Jul 21, 2004 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde die Bilder in einem Array zwischenspeichern und drehen!
dann ein grosses Bild erstellen und die kleinen in den Imagebuffer malen
danach abspeichern!
das ganze kann dann mit loadanimimage geladen werden
werd mal ein Beispiel bringen.......

Code: [AUSKLAPPEN]
Graphics 640,480,16,2
Dim bild (359)
bild (0) = CreateImage (100,100)
   MidHandle bild (0)
   SetBuffer ImageBuffer (bild (0))
   Rect 20,20,60,60,1
   Color 0,255,0
   Rect 22,22,20,20,1
For t = 1 To 359
   bild (t) = CopyImage (bild (0) )
   RotateImage  bild (t),T
Next

FullBild = CreateImage (1000,3600)
SetBuffer ImageBuffer (FullBild)
t = 0
For y =0 To 35
   For x =0 To 9
      DrawImage bild (t), x*100+50,y*100+50
      t=t+1
   Next
Next
SaveImage (FullBild,"Testbild.bmp")
[BB2D | BB3D | BB+]

rambo256

BeitragMi, Jul 21, 2004 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Bop:
Ich arbeite mal mit dem ImageBuffer und greife mal auch auf ein paar Lösungsansätze von Rallimen zu.
bin mir sicher das ich das heut noch fertig bekomm *hoff* Very Happy


Edit: Achja,ich steh auf die "2" Laughing
Asus F53z

Das Leben ist eine reine Konkatenation...

rambo256

BeitragMi, Jul 21, 2004 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
also soweit bin ich schon:

Code: [AUSKLAPPEN]

;Imagerotieren + in EIN *.bmp-file abspeichern

Global Winkel
Global Image_dateiname$
Global Image_Datei
Global Image_Width
Global Image_Height

Dim Image(0,360)



Locate 250,200
Text 100,200,"Name des Bildes: "
Image_Dateiname$ = Input$()


Graphics 800,600,32,2
TFormFilter 0

Image_Datei = LoadImage(Image_Dateiname$+".bmp")
Image_width = ImageWidth(Image_Datei)
Image_height = ImageHeight(Image_Datei)

MaskImage Image_datei, 255,0,255
MidHandle Image_datei

Cls

Image_rotieren(Image_datei,Image_width,Image_height)



Function Image_rotieren(Image_dateiname$,Image_Width,Image_height)

For i = 1 To 360

   width = width+1
   
   If width >= (800/image_width) Then
      width = 0
      height = height+1
   EndIf
   
   
   Image(0,i) = CopyImage(Image_dateiname$)
   RotateImage Image(0,i),i

Next

Image_full = CreateImage(image_width*(800/image_width),image_height*(360/(800/image_width)))
SetBuffer ImageBuffer(Image_full)

For i = 1 To 360
   DrawImage Image(0,i),width*(image_width),height*(image_height+image_height/2)+image_height/2
Next
 
SaveImage(Image_full,"test.bmp")

Color 255,0,0
Text 200,200,"Fertig"

WaitKey
End Function 



nur ich seh gar nichts mehr auf dem abgespeicherten Bild?!
Wie kann das?
Asus F53z

Das Leben ist eine reine Konkatenation...

Bob

BeitragMi, Jul 21, 2004 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@rambo256

Hier mal mein zwischenstand:
nimm mal maximal 40 frames bei der Frage nach den frames

Ich arbeite noch dran




Code: [AUSKLAPPEN]

;Imagerotieren + in EIN *.bmp-file abspeichern

Global Winkel
Global Image_dateiname$
Global Image_Datei
Global Image_Width
Global Image_Height
Global Frames

Const ScreenX = 640
Const ScreenY =480

Graphics ScreenX,ScreenY,32,2
SetBuffer BackBuffer()

Text 100,160,"Erstellen einer Rotations Sprite Map "
Text 100,180,"Die Pixelfarbe an X0 , Y0 wird für Transparenz verwendet2
Text 100,200,"Name der Bmp Datei (ohnen Endung)  "
Locate 250,220

Image_Dateiname$ = Input$()
Cls

Text 100,180,"Erstellen einer Rotations Sprite Map "
Text 100,200,"Anzahl der Bilder in der Map ? (1-360) "
Locate 250,220
Frames = Int(Input$() )



TFormFilter 1
Image_Datei = LoadImage(Image_Dateiname$+".bmp")
Image_width = ImageWidth(Image_Datei)
Image_height = ImageHeight(Image_Datei)



Image_rotieren(Image_datei,Image_width,Image_height)



Function Image_rotieren(Image_dateiname$,Image_Width,Image_height)

;Achtung. Eine BMP Datei kann maximal 30.000 Pixel breit und / oder hoch sein bzw. 2GB
;Berechnung der Pixel hier muss ich noch basteln
DebugLog "Frames" + frames
If frames Mod 2 > 0 Then
   frames = frames +1
EndIf
DebugLog "Frames" + frames


SetBuffer ImageBuffer(Image_Datei)
GetColor 0,0
MaskImage Image_datei, ColorRed(),ColorGreen,ColorBlue()
ClsColor ColorRed(),ColorGreen,ColorBlue()


;SpriteMap vorbereiten
hFrames = frames /2
maxBreite   = Image_Width*hFrames
maxHohe    = Image_height*2

myPic = CreateImage(maxBreite,maxhohe)
SetBuffer ImageBuffer(mypic)
Cls


grad# = 360 / frames

Local X = 0
Local Y = 0
Local rImage      ;Unser rotationsdummy

For i = 0 To Frames-1

      rImage = CopyImage(Image_dateiname$)
   MidHandle rimage
      RotateImage rImage,i*grad
    SetBuffer ImageBuffer(myPic)
   DrawImage rImage,x+(image_Width/2),y+(Image_height/2)
   SetBuffer BackBuffer()
   Cls
   DrawImage rImage, screenX/2, ScreenY/2
   Flip

   DebugLog "X Y " + x + " " +Y
   x = x + image_width
   If x=maxBreite Then
      x = 0
      y =y+image_height

   EndIf



   DebugLog i

Next

SaveBuffer(ImageBuffer(mypic),"c:\test.bmp")

WaitKey
End Function 

rambo256

BeitragMi, Jul 21, 2004 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs rausbekommen

edit: also warum der mir nichts mehr zeichnet Laughinge
edit2: ok mach ich
Asus F53z

Das Leben ist eine reine Konkatenation...

Bob

BeitragMi, Jul 21, 2004 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok. Jetzt hab ich's hin bekommen.
Wenn insgesamt 360 Bilder zusammengefasst werden klappt dies nun.

Jetzt hat mich allerdinge der Ehrgeiz gepackt.
Allerdings geh ich nun ertmal in den Biergarten.
Werde morgen mal sehen was sich noch getan hat.
Brauch noch ne funktion die mir die am besten ausrechnet wie breit und hoch das sprite map sein soll um eine möglichst gleichmässige Verteilung hin zu bekommen. Dann kann man die Anzahl der Frames (die erzeugt werden soollen) frei bestimmen.

rambo256

BeitragMi, Jul 21, 2004 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
habs jetzt auch:

Code: [AUSKLAPPEN]

;Imagerotieren + in EIN *.bmp-file abspeichern

Global Winkel
Global Image_dateiname$
Global Image_Datei
Global Image_Width
Global Image_Height

Dim Image(0,360)



Locate 250,200
Text 100,200,"Name des Bildes: "
Image_Dateiname$ = Input$()


Graphics 800,600,32,2
TFormFilter 0

Image_Datei = LoadImage(Image_Dateiname$+".bmp")
Image_width = ImageWidth(Image_Datei)
Image_height = ImageHeight(Image_Datei)

MaskImage Image_datei, 255,0,255
MidHandle Image_datei
ClsColor 255,255,255
Cls

Image_rotieren(Image_datei,Image_width,Image_height)



Function Image_rotieren(Image_dateiname$,Image_Width,Image_height)

For i = 1 To 360

   
   Image(0,i) = CopyImage(Image_dateiname$)
   RotateImage Image(0,i),i

Next


Image_full = CreateImage(image_width*(800/image_width),(image_height*(360/(600/image_width))+image_height))
SetBuffer ImageBuffer(Image_full)

For i = 1 To 360

   width = width+1
   
   If width >= (800/image_width) Then
      width = 0
      height = height+1
   EndIf

   
   DrawImage Image(0,i),width*(image_width)+(image_width/2),height*(image_height+image_height/2)+image_height/2

Next

SetBuffer FrontBuffer()

SaveImage(Image_full,Image_Dateiname$+"-rotate.bmp")


Color 255,0,0
Text 200,200,"Fertig"


WaitKey

Cls

DrawImage Image_full,0,0

WaitKey 
End Function 


Nur da gibt es noch einen Bug:
die Bilder überschneiden sich teilweise,also immer dann wenn die Seiten nicht ungefähr gleich lang sind.
Da muss ich dann wohl mit Sin und Cos noch den abstand zwischen den Bildern ausmachen.
Asus F53z

Das Leben ist eine reine Konkatenation...

Hubsi

BeitragMi, Jul 21, 2004 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
@Bob: Ups, an die Sache mit dem Speichern hab ich nicht mehr gedacht Embarassed Hab aber heute keinen Kopf mehr dafür Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Bob

BeitragDo, Jul 22, 2004 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.

Ok. Das Theme ist beendet.
Dank eurer Unterstützung, mit besondern Dank an Rambo256,
hab ich nun genau was ich wollte.

Quasi als Abfallprodukt ist nun auch ein kleines aber feines Tool herausgekommen.

download unter
http://www.iomagic.de/bb/spriterot.zip
ca. 600 K

Das Programm läde ein belibiges Bitmap (Demo dabei) und erstellt eine Sprite Rotationsmap die unter belibigem Namen abgespeichert werden kann. Die Anzahl der Frames ist frei wählbar.
Bei Eingabe von z.B 10 Frames wird das Sprite um jeweils 36 Grad gedreht. Anschließend kann die erstellet Datei sofort kontrolliert werden.
Als Transparenzfarbe wird das Pixel an Position X0, Y0 verwendet.
Ich poste eine Kopie dieser Nachricht auch mal in Projekt.

Nochmals Dank an alle. Smile

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group