amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Animgif via Datatype? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

18.05.2009, 12:47 Uhr

MaikG
Posts: 5172
Nutzer
Ich würde gerne Animierte gif's darstellen können.
Nun habe ich zum testen ob das überhaupt geht Aweb mal auf
Datatypes gestellt. Der DT von OS3.9 und Akgif bringen leider nur
unbewegte Bilder hervor.

Kann Aweb nur nicht richtig damit umgehen oder ist es generell nicht
möglich?

[ - Antworten - Zitieren - Direktlink - ]

18.05.2009, 13:00 Uhr

thomas
Posts: 7716
Nutzer

Anim-GIFs ist ein bißchen schwierig. Es gibt einen Animations-Datatype, mit dem z.B. IFF-Anims gelesen werden können. Es gibt auch eine GIFANIM-Klasse, die auf diese Weise IFF-Anims anzeigt. Damit kann nur leider außer Multiview kein Programm etwas anfangen.

Die andere Möglichkeit, ist es, die GIF-Anim als Bilddatei mit mehreren Seiten zu laden. Seit OS 3.5 gibt es die Tags PDTA_GetNumPictures und PDTA_WhichPicture, mit denen man die Anzahl Einzelbilder ermitteln und ein Einzelbild auswählen kann. Die Tags funktionieren auch unter OS 3.1, wenn man ein GIF-Datatype installiert, das die Tags unterstützt. Mit dieser Methode verliert man natürlich die Timings, die u.U. in der Animation gespeichert sind. Aber dafür ist es relativ einfach, die Animation zu laden und anzuzeigen. PicShow macht das z.B. so.

Soweit ich weiß, kann kein Browser Animationen mit Datatypes laden.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

18.05.2009, 13:19 Uhr

MaikG
Posts: 5172
Nutzer
Zitat:
Original von thomas:

Die andere Möglichkeit, ist es, die GIF-Anim als Bilddatei mit mehreren Seiten zu laden. Seit OS 3.5 gibt es die Tags PDTA_GetNumPictures und PDTA_WhichPicture, mit denen man die Anzahl Einzelbilder ermitteln und ein Einzelbild auswählen kann. Die Tags funktionieren auch unter OS 3.1, wenn man ein GIF-Datatype installiert, das die Tags unterstützt. Mit dieser Methode verliert man natürlich die Timings, die u.U. in der Animation gespeichert sind. Aber dafür ist es relativ einfach, die Animation zu laden und anzuzeigen. PicShow macht das z.B. so.

Soweit ich weiß, kann kein Browser Animationen mit Datatypes laden.


Das Klingt eigentlich ganz gut, die Einzelbilder würden mir reichen.
Ich denke die Timings werde ich manuell extrahieren können.
Muss nur noch ein Gif Datatype existieren der das beherscht.

[ - Antworten - Zitieren - Direktlink - ]

18.05.2009, 13:37 Uhr

MaikG
Posts: 5172
Nutzer
Wenn ich mir PDTA_GetNumPictures hole kommt da bei Ak und den OS3.9 gif datatype 0 zurück :(
Das holt man doch dort an der Stelle bei PDTA_Bitmap und PDTA_BitmapHeader?

Sonst wüsste ich kein Datatype welchen ich probieren sollte, WarpDT hat
scheinbar kein Gif dabei.

Ansonsten müsste ich probieren das Gif selbst zu Zerlegen,
dem 2.Bild usw. den 1. Header vorsetzen. Weiss nur nicht ob das so
einfach funktioniert.

[ - Antworten - Zitieren - Direktlink - ]

18.05.2009, 14:19 Uhr

thomas
Posts: 7716
Nutzer
@MaikG:

Zitat:
Das holt man doch dort an der Stelle bei PDTA_Bitmap und PDTA_BitmapHeader?

Nein, beim NewDTObject. In den Autodocs ist ein Beispiel.

Mit dem OS 3.9-Datatype funktioniert das auf jeden Fall. Das wird z.B. bei dem AnimIcon-Programm aus dem Christmas-Update benutzt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

18.05.2009, 16:27 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Siehe auch im Amiblitz3 Code:

SourcecodesIncludesimage.include.bb2image_LoadViaDT{image.l,filename.s,imgnum.l}

imgnum ist dann die entsprechende Nummer, und siehe

SourcecodesIncludesimage.include.bb2image_Examine{filename.s}

wie man herausbekommt, wie viele Frames es überhaupt gibt.

... oder eben wie immer, gleich Amiblitz3 benutzen ;-)

--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 18.05.2009 um 16:28 Uhr geändert. ]

[ Dieser Beitrag wurde von Der_Wanderer am 18.05.2009 um 16:28 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 10:54 Uhr

MaikG
Posts: 5172
Nutzer
Zitat:
Original von thomas:
@MaikG:

Zitat:
Das holt man doch dort an der Stelle bei PDTA_Bitmap und PDTA_BitmapHeader?

Nein, beim NewDTObject. In den Autodocs ist ein Beispiel.

Mit dem OS 3.9-Datatype funktioniert das auf jeden Fall. Das wird z.B. bei dem AnimIcon-Programm aus dem Christmas-Update benutzt.

Gruß Thomas


Danke, das funktioniert schonmal mit einigen gifs.
Nur gibt es jetzt auch spezielle die Speichersparender arbeiten.
Wo das nächste bild nur ein Ausschnitt des vorherigen ist.
Wenn ich das jetzt richtig beachte(Dieses AnimIcon tut dies nicht)
sieht die Anim eigenarig aus.
Ich glaube ich benötige eine Art Transparenz, denn es scheint
so als sei die nicht vorhanden.
Wie geht das oder gehts gar nicht?

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 11:42 Uhr

thomas
Posts: 7716
Nutzer
@MaikG:

Transparenz gibt es bei Datatypes leider nicht. Aber die Position, wo der Ausschnitt im Bild hingehört, ist im BitMapHeader enthalten.

Hier ist ein Beispiel, das das berücksichtigt: http://thomas-rapp.homepage.t-online.de/examples/dtanim.c

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 12:20 Uhr

MaikG
Posts: 5172
Nutzer
Zitat:
Original von thomas:
@MaikG:

Transparenz gibt es bei Datatypes leider nicht. Aber die Position, wo der Ausschnitt im Bild hingehört, ist im BitMapHeader enthalten.

Hier ist ein Beispiel, das das berücksichtigt: http://thomas-rapp.homepage.t-online.de/examples/dtanim.c

Gruß Thomas


Die Positionierung hab ich schon ferig.
Man muss doch die Hintergrundfarbe irgendwie Transparent bekommen.
Bei BltBitmap gibt es doch solche 0x0c sachen, kann davon keine
Option sowas?
PlayCD liesst z.B. über Datatypes und kann Transparent man merkt es wenn man den Skin umwandelt in ein Format dessen Datatype keine Transparenz beherrscht.


[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 13:22 Uhr

whose
Posts: 2156
Nutzer
@thomas:

War es nicht eher so, daß Datatypes i.A. durchaus Transparenz beherrschen, das Ganze aber an fehlerhaften Versionen des picture.datatype scheiterte, welche die Transparenzinformationen nicht durchreichten bzw. Alpha-Informationen einfach durch Festwerte ersetzten? Ich entsinne mich an ein Dokument von Andreas Kleinert, in dem diese Problematik angesprochen wurde, weiß jetzt aber nicht aus dem Stegreif, welches Dokument das war.

Grüße


--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 14:07 Uhr

thomas
Posts: 7716
Nutzer
@whose:

Macht das einen Unterschied, wer dran Schuld ist ? Beim Programm kommt so oder so nichts an.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 14:07 Uhr

MaikG
Posts: 5172
Nutzer
Ich hab den:
picture.datatype 45.17 (19.03.02)

Das 1. Bild kommt gut, das 2. scheint aber einzelne Pixel
des 1. zu verwenden welche aber als weiss(Farbe 0) erscheinen.
Also sind wohl mehrere Farben Transparent und sollten entsprechend
nicht auf den Rastport geschrieben werden.

Das einzige was mir noch einfallen würde wäre einen Filter
zu schreiben der die Bilder sozusagen mixt.
Nur ist das kompliziert und unter Basic lahm
nehme ich an.

Kann man BltBitmapRast nicht überreden die 0 Farbe nicht zu schreiben?

[ Dieser Beitrag wurde von MaikG am 22.05.2009 um 14:07 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 14:10 Uhr

thomas
Posts: 7716
Nutzer
@MaikG:

Du könntest mal probieren, ob PDTA_MaskPlane irgendwas sinnvolles zurückgibt, das dann mit BltMaskBitMapRastPort verwendet werden kann.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 14:45 Uhr

MaikG
Posts: 5172
Nutzer
Dort kommt nur immer 0 zurück.

Aber BltMaskBitMapRastPort klingt Intressant, das extrahieren der Transparenten Farben direkt aus dem Gif wäre ja möglich. Wie beim Timing.

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 15:52 Uhr

akl
Posts: 265
Nutzer
@MaikG:

Generell sind Animations- und Bilddatypes zwei unterschiedliche Dinge. Man könnte das per intelligentem Descriptor auseinanderhalten, aber spätestens bei "GIF24" (s.u.) bricht das in sich zusammen.

akGIF liefert Dir defaultmäßig nur das erste Bild - oder setzt aus einer nicht-animierten Einzelbildfolge ein 24 Bit-Bild zusammen ("GIF24"). Transparenzinformation wird für das Einzelbild als Index (für eine Farbe) oder als Alpha-Channel mitgeliefert.

Leider sind die diversen picture-Datatype-Implementierungen, was Alpha Channel angeht, teilweise fehlerhaft - oder zumindest unterschiedlich im Verhalten.

Über eine Konfigurationsoption des Datatypes kann man sich auch Einzelbilder holen (TILED_LOADING=ON, TILE_NUMBER=nnn) - aber dieses Gebastel würde ich niemandem empfehlen.

Der Ansatz mit dem Blitten ist der richtige, allerdings ist es - zumindest bei akGIF - vermutlich am Einfachsten, wenn Du TRANSTOALPHA=ON setzt, und dann mit Cybergraphics-Funktionen arbeitest (echter Alpha-Channel).

[ Dieser Beitrag wurde von akl am 22.05.2009 um 15:54 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 16:06 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@akl

Seit wann gibt es in CGX Alpha Channel Funktionen?
Oder meinst du Read/Write Pixelarray und per Hand mischen?

--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 16:22 Uhr

akl
Posts: 265
Nutzer
@Der_Wanderer:
In einer oder mehrerer der Myriaden AmigaOS-Versionen, -Derivate und -Kopien gibt es WritePixelArrayAlpha() - und ein WritePixelArray() was damit nicht richtig umgeht. Ich will mich aber nicht zu weit aus dem Fenster lehnen.

Im Grunde genommen ist es in 2009 kein Zustand, dass man sowas selber implementieren muss...

[ - Antworten - Zitieren - Direktlink - ]

22.05.2009, 16:45 Uhr

MaikG
Posts: 5172
Nutzer
CGX hat doch Alphachannel ARGB oder?
Also momentan gibt mir der DType die Einzelbilder, diese werden
mit Readpixelarray gecached und mit WritePixelArray letztendlich
im Loop wiedergegeben.
Bei AGA dementsprechend ein 8 hinter den Funktionen.

Dieses BltBitmapMaskRastport dings da irretiert mich, es ist die Rede von Planes, das Bild kommt aber in 24 Bit vom Datatype wegen dem Destmode.

[ - Antworten - Zitieren - Direktlink - ]

23.05.2009, 00:17 Uhr

Wishmaster
Posts: 140
Nutzer
Bei Alfi git es die GifAnim-MCC http://alfie.altervista.org/
--
Pegasos MorphOS

[ - Antworten - Zitieren - Direktlink - ]

27.05.2009, 21:04 Uhr

MaikG
Posts: 5172
Nutzer
Zitat:
Original von Wishmaster:
Bei Alfi git es die GifAnim-MCC http://alfie.altervista.org/


Ich weiss weder wie MUI Funktioniert noch hab ich die Basic Includes dafür. Ausserdem weiss ich nicht wie diese Klasse auf diese GIFs reagiert.

So ich habe nun ein Filter geschrieben der das Weiss gegen Informationen aus dem Letzten Bild ersetzt.
Problem ist nur es gibt >neues< Weiss welches tatsächlich
Weiss dargestellt werden soll und nicht Transparent.
Im ganzen sieht die Anim besser aus als vom DT aber immernoch
teilweise falsch.
Praktisch kann ich nicht unterscheiden ob Pixel XY nun Transparent
soll oder nicht.

[ - Antworten - Zitieren - Direktlink - ]

28.05.2009, 08:04 Uhr

akl
Posts: 265
Nutzer
@MaikG:
DTM_WRITEPIXELARRAY liefert Dir auf Anfrage auf jeden Fall ARGB oder RGBA - mit Ausnahme irgendeiner pic-dt-Version, die das nicht fehlerfrei kann.

[ - Antworten - Zitieren - Direktlink - ]

29.05.2009, 10:47 Uhr

MaikG
Posts: 5172
Nutzer
Zitat:
Original von akl:
@MaikG:
DTM_WRITEPIXELARRAY liefert Dir auf Anfrage auf jeden Fall ARGB oder RGBA - mit Ausnahme irgendeiner pic-dt-Version, die das nicht fehlerfrei kann.


Okay, also hab ich mir mal die Includes dazu gebastelt und
folgendes gebaut. Stürzt leider nur ab und macht nichts weiter:

code:
Counter&=0
BildAnzahl&=1
First%=1
WHILE PCounter&<BildAnzahl&
 workbuf& = AllocVec& (1024, MEMF_PUBLIC& OR MEMF_CLEAR&)

 IF workbuf& THEN
  TAGLIST workbuf&, _
   DTA_SourceType&,	DTST_FILE&, _
   DTA_GroupID&,	GID_PICTURE&, _
   PDTA_Screen&, 	mysc&, _
   PDTA_DestMode&,      1&, _
   PDTA_WhichPicture&,  PCounter&, _
   PDTA_GetNumPictures&, VARPTR(BildAnzahl&),_
  TAG_END&
  dtobjekt& = NewDTObjectA& (SADD(Picture$ + CHR$(0)), workbuf&)
  IF dtobjekt& THEN
   gplayout& = AllocVec&(gpLayout_sizeof%, MEMF_PUBLIC& OR MEMF_CLEAR&)
   IF gplayout& THEN
    POKEL gplayout& + gpLayoutMethodID%, DTM_PROCLAYOUT&
    POKEL gplayout& + gpl_GInfo%, NULL&
    POKEL gplayout& + gpl_Initial%, TRUE&
    IF DoDTMethodA& (dtobjekt&, NULL&, NULL&, gplayout&) THEN
     TAGLIST workbuf&, _
      PDTA_BitMapHeader&, VARPTR(bmheader&), _
      PDTA_BitMap&,       VARPTR(bitmapadr&), _
     TAG_END&						
     IF GetDTAttrsA& (dtobjekt&, workbuf&) = 2 THEN
      pwidth% = PEEKW(bmheader& + bmh_Width%):pheight% = PEEKW(bmheader& + bmh_Height%)
      pLeft% = PEEKW(bmheader& + bmh_Left%):ptop% = PEEKW(bmheader& + bmh_Top%)

      pdtBPA& = AllocVec&(sizeof_pdtBlitPixelArray%, MEMF_PUBLIC& OR MEMF_CLEAR&)
      IF pdtBPA& THEN  


       posx%=92+pleft%:posy%=14+thetopborder%+ptop%

       IF first% THEN 
        pdepth%=PEEKB(bmheader& + bmh_Depth%)
        Memsize&=pwidth%*pheight%
        Memsize&=((Memsize& * 4)+15) AND NOT 15
        bpr&=((pwidth%*4)+15) AND NOT 15 
        first%=0:tempbm&=NULL&  
       END IF


      PicFrameBuffer&(PCounter&) = 0&
      IF BildAnzahl&>1 AND PCounter&<200 THEN
       PicFrameBuffer&(PCounter&) = AllocVec&(Memsize&+4096, MEMF_PUBLIC& OR MEMF_CLEAR&)
       IF PicFrameBuffer&(PCounter&) THEN 
        PicFrameX%(PCounter&)=posx%:PicFrameY%(PCounter&)=posy%
        PicFrameW%(PCounter&)=pwidth%:PicFrameH%(PCounter&)=pheight%


 TAGLIST pdtBPA&, _
      PDTA_BitMapHeader&, VARPTR(bmheader&), _
      PBPA_MethodID%, PDTM_WRITEPIXELARRAY&,_
      pbpa_PixelData%, PicFrameBuffer&(PCounter&),_ 
      pbpa_PixelFormat%, PBPAFMT_ARGB&,_
      pbpa_PixelArrayMod%, bpr&,_
      pbpa_Left%, 0,_
      pbpa_Top%, 0,_
      pbpa_Width%, pwidth%,_
      pbpa_Height%,pheight%,_
 TAG_END&

junk&=DoSuperMethodA&(dtobjekt&,Null&, pdtBPA&)



junk&=WritePixelArray& (PicFrameBuffer&(PCounter&),0,0,bpr&,rp&,PicFrameX%(PCounter&),PicFrameY%(PCounter&),PicFrameW%(PCounter&),PicFrameH%(PCounter&),RECTFMT_ARGB&)
        
       END IF
      END IF
     END IF
     END IF
    END IF
   FreeVec gplayout&
   END IF
   DisposeDTObject dtobjekt&
  END IF
  FreeVec workbuf&
 END IF
INCR PCounter&
WEND



Was ist falsch?

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Animgif via Datatype? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.