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

amiga-news.de Forum > Programmierung > iff24 Speichern? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

16.09.2008, 18:52 Uhr

MaikG
Posts: 5172
Nutzer
Wie speichert man die 24 Bit Variante des Formats?
BMHD hab ich glaube ich schon kapiert aber
wie kommen die Bildpunkte jetzt in die Datei(unkompremiert weils einfacher ist)?

[ - Antworten - Zitieren - Direktlink - ]

16.09.2008, 20:15 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Meine Antwort wie immer: in Amiblitz waere das...

image_Save{0,"myImage.iff",@"ILBM"}

oooder schau dir den Code dazu an. "iff/ilbm.include.bb2".
Du musst die 24bit RGB Daten in 24 einzelne Bitplanes verwandeln. Das ist super ineffizient und langsam, deshalb gibt es auch das "DEEP" Format, was aber nicht ganz offiziell ist und nicht unbdingt immer unterstuetzt wird.

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


[ - Antworten - Zitieren - Direktlink - ]

16.09.2008, 21:43 Uhr

MaikG
Posts: 5172
Nutzer
24 Bitplanes, für 24 Bit noch Planar speichern?

Ich dachte an sowas wie

0xFFFFFF 0xFF0000 0x00FF00 0x0000FF

für ein weiss, rot, grün und blauen Punkt.
bb2 Dateien, wo immer die auch her ist kann man meistens nicht
lesen(kein ASCII).

Wie siehts mit Speichern via Datatype aus?
Ich habe ein Beispiel dafür gefunden aber nicht so richtig
durchgesehen. Weil da würde nie die Datatype selectiert mit
dem man Speichern will.

[ - Antworten - Zitieren - Direktlink - ]

16.09.2008, 22:34 Uhr

Blackbird
Posts: 634
Nutzer
@MaikG:

Zitat:
bb2 Dateien, wo immer die auch her ist kann man meistens nicht
lesen(kein ASCII).


da hast du zwar recht, aber wenn du Ab3 installierst, dir den Source einlädst,kannst du das anschließend auch selbst als ascii speichern und lesen...
--
regards
Blackbird

Have a look at:
http://www.blackbird-net.de

Skins for PlayCD OS3.9
BlackShoot, Zombies Apocalypse, GalagaWars, VcdImager-Gui,PerfectPaint

[ - Antworten - Zitieren - Direktlink - ]

16.09.2008, 22:47 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Zitat:
Original von MaikG:
24 Bitplanes, für 24 Bit noch Planar speichern?

Yup.

Zitat:
Ich dachte an sowas wie

0xFFFFFF 0xFF0000 0x00FF00 0x0000FF

für ein weiss, rot, grün und blauen Punkt.

nope. Das wäre IFF-DEEP, kein normales 24bit IFF.

Zitat:
bb2 Dateien, wo immer die auch her ist kann man meistens nicht
lesen(kein ASCII).

Man kann alles lesen bis auf die Tokens, und die verwende ich kaum.
Die Includes sind ALLE bei der Distribution dabei, die man hier für Umme kriegt und damit die .bb2 Files sogar richtig lesen kann ;-)
http://amiblitz3.amiforce.de

Zitat:
Wie siehts mit Speichern via Datatype aus?
Ich habe ein Beispiel dafür gefunden aber nicht so richtig
durchgesehen. Weil da würde nie die Datatype selectiert mit
dem man Speichern will.

Datatypes unterstützen "nur" IFF-ILBM zum speichern. Und das auch nur zuverlässig in 8bit oder weniger. 24bit crashed zumindest unter OS3.1, OS3.5 und 3.9.

Wenn du aber immer noch nicht AB3 herunterladen willst, habe ich dir den Auszug des relevanten Teils mal rauskopiert:

- die Routine kann RGB und ARGB, je nachdem ob bitdepth=24 oder 32 ist
- sie geht von einem ARGB PixelArray aus in ARGBptr, es sollte aber ein Leichtes sein das zu ändern falls deine Daten in einem anderen Pixelformat vorliegen
- die anderen Variablen sollten intuitiv oder aus dem Kontext sein)

code:
;Bitplanes bit masks
#PF_A1 = $01000000 ;Alpha
#PF_A2 = $02000000
#PF_A3 = $04000000
#PF_A4 = $08000000
#PF_A5 = $10000000
#PF_A6 = $20000000
#PF_A7 = $40000000
#PF_A8 = $80000000

#PF_R1 = $00010000 ;Red
#PF_R2 = $00020000
#PF_R3 = $00040000
#PF_R4 = $00080000
#PF_R5 = $00100000
#PF_R6 = $00200000
#PF_R7 = $00400000
#PF_R8 = $00800000

#PF_G1 = $00000100 ;Green
#PF_G2 = $00000200
#PF_G3 = $00000400
#PF_G4 = $00000800
#PF_G5 = $00001000
#PF_G6 = $00002000
#PF_G7 = $00004000
#PF_G8 = $00008000

#PF_B1 = $00000001 ;Blue
#PF_B2 = $00000002
#PF_B3 = $00000004
#PF_B4 = $00000008
#PF_B5 = $00000010
#PF_B6 = $00000020
#PF_B7 = $00000040
#PF_B8 = $00000080

...

    ; write BODY chunk
    file_WriteChunk{dos,@"BODY",-1,False}
    blen.l = (img_width + 15) / 16 * 2 ; byte length for one bitplane line
    tmp01.l = tmp +  0 * blen
    tmp02.l = tmp +  1 * blen
    tmp03.l = tmp +  2 * blen
    tmp04.l = tmp +  3 * blen
    tmp05.l = tmp +  4 * blen
    tmp06.l = tmp +  5 * blen
    tmp07.l = tmp +  6 * blen
    tmp08.l = tmp +  7 * blen
    tmp09.l = tmp +  8 * blen
    tmp10.l = tmp +  9 * blen
    tmp11.l = tmp + 10 * blen
    tmp12.l = tmp + 11 * blen
    tmp13.l = tmp + 12 * blen
    tmp14.l = tmp + 13 * blen
    tmp15.l = tmp + 14 * blen
    tmp16.l = tmp + 15 * blen
    tmp17.l = tmp + 16 * blen
    tmp18.l = tmp + 17 * blen
    tmp19.l = tmp + 18 * blen
    tmp20.l = tmp + 19 * blen
    tmp21.l = tmp + 20 * blen
    tmp22.l = tmp + 21 * blen
    tmp23.l = tmp + 22 * blen
    tmp24.l = tmp + 23 * blen
    tmp25.l = tmp + 24 * blen
    tmp26.l = tmp + 25 * blen
    tmp27.l = tmp + 26 * blen
    tmp28.l = tmp + 27 * blen
    tmp29.l = tmp + 28 * blen
    tmp30.l = tmp + 29 * blen
    tmp31.l = tmp + 30 * blen
    tmp32.l = tmp + 31 * blen

    omax.l = (img_width-1) LSR 4

    For y.l = 0 To img_height-1  ; for each line
      For o.l = 0 To omax ; go for all 16 pixel
        flag.l = 1 LSL 15
        plane01.l = 0
        plane02.l = 0
        plane03.l = 0
        plane04.l = 0
        plane05.l = 0
        plane06.l = 0
        plane07.l = 0
        plane08.l = 0
        plane09.l = 0
        plane10.l = 0
        plane11.l = 0
        plane12.l = 0
        plane13.l = 0
        plane14.l = 0
        plane15.l = 0
        plane16.l = 0
        plane17.l = 0
        plane18.l = 0
        plane19.l = 0
        plane20.l = 0
        plane21.l = 0
        plane22.l = 0
        plane23.l = 0
        plane24.l = 0
        plane25.l = 0
        plane26.l = 0
        plane27.l = 0
        plane28.l = 0
        plane29.l = 0
        plane30.l = 0
        plane31.l = 0
        plane32.l = 0

        o4.l = o LSL 4
        oend.l = Min(o4+15,img_width-1)
        For x.l = o4 To oend
          dat.l = Peek.l( ARGBptr + (x*bpp+y*bpr) )
          ; red
          If dat&#PF_R1 Then plane01 | flag
          If dat&#PF_R2 Then plane02 | flag
          If dat&#PF_R3 Then plane03 | flag
          If dat&#PF_R4 Then plane04 | flag
          If dat&#PF_R5 Then plane05 | flag
          If dat&#PF_R6 Then plane06 | flag
          If dat&#PF_R7 Then plane07 | flag
          If dat&#PF_R8 Then plane08 | flag

          ; green
          If dat&#PF_G1 Then plane09 | flag
          If dat&#PF_G2 Then plane10 | flag
          If dat&#PF_G3 Then plane11 | flag
          If dat&#PF_G4 Then plane12 | flag
          If dat&#PF_G5 Then plane13 | flag
          If dat&#PF_G6 Then plane14 | flag
          If dat&#PF_G7 Then plane15 | flag
          If dat&#PF_G8 Then plane16 | flag

          ; blue
          If dat&#PF_B1 Then plane17 | flag
          If dat&#PF_B2 Then plane18 | flag
          If dat&#PF_B3 Then plane19 | flag
          If dat&#PF_B4 Then plane20 | flag
          If dat&#PF_B5 Then plane21 | flag
          If dat&#PF_B6 Then plane22 | flag
          If dat&#PF_B7 Then plane23 | flag
          If dat&#PF_B8 Then plane24 | flag

          ; alpha
          If dat&#PF_A1 Then plane25 | flag
          If dat&#PF_A2 Then plane26 | flag
          If dat&#PF_A3 Then plane27 | flag
          If dat&#PF_A4 Then plane28 | flag
          If dat&#PF_A5 Then plane29 | flag
          If dat&#PF_A6 Then plane30 | flag
          If dat&#PF_A7 Then plane31 | flag
          If dat&#PF_A8 Then plane32 | flag

          flag LSR 1
        Next
        o2.l=o LSL 1
        Poke.w tmp01+o2,plane01
        Poke.w tmp02+o2,plane02
        Poke.w tmp03+o2,plane03
        Poke.w tmp04+o2,plane04
        Poke.w tmp05+o2,plane05
        Poke.w tmp06+o2,plane06
        Poke.w tmp07+o2,plane07
        Poke.w tmp08+o2,plane08
        Poke.w tmp09+o2,plane09
        Poke.w tmp10+o2,plane10
        Poke.w tmp11+o2,plane11
        Poke.w tmp12+o2,plane12
        Poke.w tmp13+o2,plane13
        Poke.w tmp14+o2,plane14
        Poke.w tmp15+o2,plane15
        Poke.w tmp16+o2,plane16
        Poke.w tmp17+o2,plane17
        Poke.w tmp18+o2,plane18
        Poke.w tmp19+o2,plane19
        Poke.w tmp20+o2,plane20
        Poke.w tmp21+o2,plane21
        Poke.w tmp22+o2,plane22
        Poke.w tmp23+o2,plane23
        Poke.w tmp24+o2,plane24
        Poke.w tmp25+o2,plane25
        Poke.w tmp26+o2,plane26
        Poke.w tmp27+o2,plane27
        Poke.w tmp28+o2,plane28
        Poke.w tmp29+o2,plane29
        Poke.w tmp30+o2,plane30
        Poke.w tmp31+o2,plane31
        Poke.w tmp32+o2,plane32
      Next

      If compress
        For o.l = 0 To bitdepth-1
          blenC.l = ilbm_RLEncode{tmp+blen*o,tmpC,blen}
          If blenC>0
            file_WriteMem {dos,tmpC,blenC}
          End If
        Next
      Else
        file_WriteMem {dos,tmp,blen*bitdepth}
      End If
    Next
    file_CloseChunk{dos,@"BODY"}


P.S: Ja, ich weiss dass es Arrays gibt. Hier geht es nicht um Esthetik, sondern um Speed.


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



[ Dieser Beitrag wurde von Der_Wanderer am 16.09.2008 um 22:51 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.09.2008, 08:50 Uhr

thomas
Posts: 7716
Nutzer

Zitat:
24bit crashed zumindest unter OS3.1, OS3.5 und 3.9.

Dann hast du's nicht richtig gemacht. Wenn ein 24bit-Datatype installiert ist (also auf jeden Fall unter 3.5 und 3.9) funktioniert das Speichern von 24bit-Daten einwandfrei. Die Datatypes kommen nur mit 15/16bit-Daten nicht zurecht, die muß man erst auf 24bit umrechnen. Aber abstürzen tut da trotzdem nichts.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

17.09.2008, 10:33 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@thomas

Was mache ich falsch?

code:
Function.l image_SaveDT{image.l,filename.s}
SHARED imagedat()
DEFTYPE.dtWrite DTMW

succ.l=False
If \ARGBbitmap_ptr
  *DTPic._Object = NewDTObjectA_ (0,Tags(#DTA_SourceType,#DTST_RAM,@@
                                         #PDTA_DestMode,#PMODE_V43,@@
                                         #DTA_GroupID,#GID_PICTURE,@@
                                         #PDTA_Remap,0,@@
                                         #PDTA_ModeID,0,@@
                                         #PDTA_NumColors,0,@@
                                         #PDTA_BitMap,\ARGBbitmap_ptr))
  If *DTPic
    GetDTAttrsA_ *DTPic,Tags(#PDTA_BitMapHeader,&*bmhd.BitMapHeader)

    If *bmhd
      *bmhd\bmh_Width  = \img_width
      *bmhd\bmh_Height = \img_height
      *bmhd\bmh_Depth  = 24
    End If

    fh.l = Open_ (&filename.s,#MODE_NEWFILE)
    If fh
      DTMW\MethodID            = #DTM_WRITE
      DTMW\dtw_GInfo           = 0
      DTMW\dtw_FileHandle      = fh
      DTMW\dtw_Mode            = #DTWM_IFF
      DTMW\dtw_AttrList        = 0
      succ = DoDTMethodA_(*DTPic,0,0,&DTMW)
      Close_ fh
      If succ = False
        error{"\\__THIS_FUNCTION: Unable to write IFF!"}
      EndIf
    EndIf

    DisposeDTObject_ *DTPic
    \ARGBbitmap_ptr = 0; we must NULL the bitmap
  Else
    error{"\\__THIS_FUNCTION: Unable to create Datatype Object out of the bitmap!"}
  EndIf
Else
  error{"\\__THIS_FUNCTION: No bitmap!"}
End If
Function Return succ
End Function


Als Fehlermeldung bekomme ich "Unable to write IFF!", also DoDTMethodA_(*DTPic,0,0,&DTMW) schlägt fehl.

BTW, kann man verhindern dass die Bitmap bei DisposeDTObject freigegeben wird?

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



[ Dieser Beitrag wurde von Der_Wanderer am 17.09.2008 um 10:54 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.09.2008, 12:03 Uhr

thomas
Posts: 7716
Nutzer
@Der_Wanderer:

Welches Pixelformat hat die Bitmap denn ? Wie gesagt, das muß PIXFMT_RGB24 sein, sonst geht es nicht. Kann auch sein, daß die ModeID dazu passen muß, das weiß ich aber nicht sicher.

Mein Code setzt auch noch XAspect, YAspect, PageWidth und PageHeight im BitMapHeader, aber das ist glaube ich nur, damit Programme wie PPaint das Bild korrekt laden.


Zitat:
Als Fehlermeldung bekomme ich

Das ist doch kein Crash !


Zitat:
kann man verhindern dass die Bitmap bei DisposeDTObject freigegeben wird?

Es gibt ein PDTA_FreeSourceBitMap. Ich habe aber noch nicht ausprobiert, ob das was bewirkt. Da man die Bitmap in den meisten Fällen eh nach 24bit konvertieren muß, habe ich immer eine temporäre angelegt.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

17.09.2008, 12:24 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Zitat:
Original von thomas:
@Der_Wanderer:

Welches Pixelformat hat die Bitmap denn ? Wie gesagt, das muß PIXFMT_RGB24 sein, sonst geht es nicht. Kann auch sein, daß die ModeID dazu passen muß, das weiß ich aber nicht sicher.

Die Bitmap ist PIXFMT_ARGB32, die der Name \ARGBBitmap_ptr vermuten lässt ;-)
Dann wirds wohl daran liegen. Werde es vorher konvertieren.
D.h. es geht aber auch kein alpha Channel :-(

Zitat:
Mein Code setzt auch noch XAspect, YAspect, PageWidth und PageHeight im BitMapHeader, aber das ist glaube ich nur, damit Programme wie PPaint das Bild korrekt laden.
Ok, danke für den Hinweis. so weit war ich nur noch nie...

Zitat:
Zitat:
Als Fehlermeldung bekomme ich

Das ist doch kein Crash !

Ja, das ist kein Crash. Crashs bekam ich aber früher, evtl. lags aber auch an meinem Code. Sorry, habe da wohl übertrieben.

Zitat:
Zitat:
kann man verhindern dass die Bitmap bei DisposeDTObject freigegeben wird?

Es gibt ein PDTA_FreeSourceBitMap. Ich habe aber noch nicht

aha, danke.

Zitat:
ausprobiert, ob das was bewirkt. Da man die Bitmap in den meisten Fällen eh nach 24bit konvertieren muß, habe ich immer eine temporäre angelegt.

Ja, das ist dämlich.
Der Vorteil von meinem Code ist, er kann auch ARGB speichern und benötigt lediglich eine Zeile als temporären Buffer.
Manchmal geht es einfach nicht, eine Bitmap zweimal im Speicher zu halten, wenn es gosse Bilder sind.
Das macht dann auch den VMem Approach vom Zeichenprogramm zunixhte.

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



[ Dieser Beitrag wurde von Der_Wanderer am 17.09.2008 um 12:25 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.09.2008, 14:09 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@Thomas
Auch das hier geht nicht, sollte doch aber, oder?

code:
...
  *newbm.BitMap = AllocBitMap_(\img_width,\img_height,24,@@
  #BMF_MINPLANES|#BMF_SPECIALFMT|(#PIXFMT_RGB24 LSL #BMB_PIXFMT_SHIFTUP) ,0)
  If *newbm=0 Then error{"\\__THIS_FUNCTION: Unable to allocate 24bit Bitmap!"}

  *DTPic._Object = NewDTObjectA_ (0,Tags(#DTA_SourceType  ,#DTST_RAM,@@
                                         #PDTA_DestMode   ,#PMODE_V43,@@
                                         #PDTA_SourceMode ,#PMODE_V43,@@
                                         #PDTA_BitMap     ,*newbm,@@
                                         #DTA_GroupID     ,#GID_PICTURE))
  If *DTPic
    GetDTAttrsA_ *DTPic,Tags(#PDTA_BitMapHeader,&*bmhd.BitMapHeader)
    If *bmhd
      *bmhd\bmh_Width  = \img_width
      *bmhd\bmh_Height = \img_height
      *bmhd\bmh_Depth  = 24
    End If

    fh.l = Open_ (&filename.s,#MODE_NEWFILE)
    If fh
      DTMW\MethodID            = #DTM_WRITE
      DTMW\dtw_GInfo           = 0
      DTMW\dtw_FileHandle      = fh
      DTMW\dtw_Mode            = #DTWM_IFF
      DTMW\dtw_AttrList        = 0
      succ = DoDTMethodA_(*DTPic,0,0,&DTMW)
      Close_ fh
      If succ = False
        error{"\\__THIS_FUNCTION: Unable to write IFF!"}
      EndIf
    EndIf

    DisposeDTObject_ *DTPic


succ = DoDTMethodA_(*DTPic,0,0,&DTMW) scheitert wieder, und erzeugt auch keine IFF Datei, sondern eine Datei der Länge 0.

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



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

[ - Antworten - Zitieren - Direktlink - ]

17.09.2008, 15:14 Uhr

thomas
Posts: 7716
Nutzer
@Der_Wanderer:

PDTA_SourceMode ist Quatsch. Wenn du das wegmachst, dann geht's.

Zitat:
sondern eine Datei der Länge 0.

Die Datei wird durch den Open erzeugt, nicht durch die Methode. Die Methode schreibt einfach nichts. Wenn succ 0 ist, solltest du die Datei löschen.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

17.09.2008, 15:29 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Geht auch ohne PDTA_SourceMode nicht. (wobei das laut Docu notwenig ist, wenn man als Quelle eine non-standard Bitmap angeben will, also das Pendant zu PDTA_DestMode)

Die Bitmap wird aber angelegt, daran liegts nicht.

Ich kann mich erinnern, dass wir schonmal einen Thread darüber hatten, da gibt es aber auch nicht.
Der Code geht jetzt aber auch nicht mit 8bit, vorher hatte ich das mal geschafft dass 8bit ging.


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



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

[ - Antworten - Zitieren - Direktlink - ]

17.09.2008, 20:33 Uhr

thomas
Posts: 7716
Nutzer
Zitat:
Original von Der_Wanderer:
Geht auch ohne PDTA_SourceMode nicht.


Seltsam. Ich habe genau dein Beispiel benutzt, 1:1 nach C übersetzt und dann solange probiert, bis es funktionierte. Am Ende hing es nur am SourceMode. Wenn das drin war, dann ging's nicht und wenn's draußen war, dann ging's.

Schau dir mal dieses Beispiel an: http://thomas-rapp.homepage.t-online.de/examples/savewin.c

Das funktioniert auf allen mir bekannten Plattformen. Hab's gerade nochmal getestet.

Bei <= 8bit mußt du eine ModeID angeben.

Mit den Tags muß man immer ein bißchen nach Gefühl entscheiden, welche für NewDTObject überhaupt relevant sind. Die Dokumentation schweigt sich darüber leider aus. Viele sind einfach nur für die Kommunikation zwischen Sub-Klasse (also ilbm, jpeg, gif etc.) und picture.datatype gedacht, die braucht man im Anwendungsprogramm überhaupt nicht. PDTA_SourceMode ist eins davon, soviel ich weiß.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

18.09.2008, 12:21 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@thomas:
Danke für das Beispiel.
Im Prinzip mache ich das genauso, das hat mich grübeln lassen...
Dann habe ich das Datatpye von AfA entfernt und es geht!

D.h. das AROS Datatype kann nicht speichern, zumindest nicht 24bit.
Das OS3.9 kann definitiv speichern.

Das werde ich mal bei Bernd anmelden.


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


[ - Antworten - Zitieren - Direktlink - ]

18.09.2008, 13:08 Uhr

thomas
Posts: 7716
Nutzer
@Der_Wanderer:

Also ich habe gestern abend OS 3.1 ohne und mit Grafikkarte, OS 3.9 mit Grafikkarte, OS 4.0 und MorphOS ausprobiert und die gingen alle. AfA habe ich nicht getestet.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

19.09.2008, 11:30 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@MaikG
Sorry dass ich den Thread etwas benutzt habe, dafür hast du nun Basic Code um "per Hand" zu speichern sowie via Datatype, mit der Einschränkung, dass es auf AfA Systemen vorerst nicht geht.


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


[ - Antworten - Zitieren - Direktlink - ]

19.09.2008, 22:39 Uhr

MaikG
Posts: 5172
Nutzer
Ist kein Problem, habe beides versucht in MBasic zu übersetzen.
Das mit den Datatype scheint mir einfacher. Allerdings haut
da irgendwas noch nicht hin:

code:
Datei$="ram:test"
workbuf& = AllocVec& (1024, MEMF_PUBLIC& OR MEMF_CLEAR&)
 IF workbuf& THEN
  TAGLIST workbuf&, _
   DTA_SourceType&,	DTST_RAM&, _
   DTA_GroupID&,	GID_PICTURE&, _
   PDTA_BitMap&,        bm&, _
   PDTA_DestMode&,      1&, _
  TAG_END&
  dtobjekt& = NewDTObjectA& (NULL&, workbuf&)
  IF dtobjekt& THEN
     TAGLIST workbuf&, _
      PDTA_BitMapHeader&, VARPTR(bmheader&), _
      PDTA_BitMap&, VARPTR(bitmapadr&), _
     TAG_END&
    IF GetDTAttrsA& (dtobjekt&, workbuf&) THEN
      POKEW bmheader&+bmh_Width%, 1600
      POKEW bmheader&+bmh_Height%,1200
      POKEB bmheader&+bmh_Depth%,24
      POKEB bmheader&+bmh_XAspect%,22
      POKEB bmheader&+bmh_YAspect%,22
      POKEW bmheader&+bmh_PageWidth%, 1600
      POKEW bmheader&+bmh_PageHeight%,1200 
    END IF

    Datei& = xOpen&(SADD(Datei$ + CHR$(0)), MODE_NEWFILE&)
    IF Datei& THEN
      gplayout& = AllocVec&(gpLayout_sizeof%, MEMF_PUBLIC& OR MEMF_CLEAR&)
      IF gplayout& THEN
       POKEL gplayout& + gpLayoutMethodID%, DTM_WRITE&
       POKEL gplayout& + gpl_GInfo%, NULL&
       POKEL gplayout& + dtw_FileHandle%, Datei&
       POKEL gplayout& + dtw_Mode%, DTWM_IFF& 
       POKEL gplayout& + dtw_AttrList%, NULL&
       IF DoDTMethodA& (dtobjekt&, NULL&, NULL&, gplayout&) THEN fail%=1			
      END IF

      junk&=xClose&(Datei&)
    END IF
  DisposeDTObject dtobjekt&
  END IF 
FreeVec workbuf&
END IF


Da kommt ein Gelber "Recoverable Alert"

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > iff24 Speichern? [ - Suche - Neue Beiträge - Registrieren - Login - ]


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