Animiertes Image im Speicher erstellen und Speichern
Übersicht

![]() |
BobBetreff: Animiertes Image im Speicher erstellen und Speichern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-bitGast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? ![]() rambo256 hat Folgendes geschrieben: Graphics 800,600,22,2 SetBuffer BackBuffer() TFormFilter 2 |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ 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* ![]() Edit: Achja,ich steh auf die "2" ![]() |
||
Asus F53z
Das Leben ist eine reine Konkatenation... |
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habs rausbekommen
edit: also warum der mir nichts mehr zeichnet ![]() edit2: ok mach ich |
||
Asus F53z
Das Leben ist eine reine Konkatenation... |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Bob: Ups, an die Sache mit dem Speichern hab ich nicht mehr gedacht ![]() ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group