ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Speichern via Datatypes | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
06.02.2006, 13:29 Uhr bubblebobble Posts: 707 Nutzer |
Hallo Alle! Ich möchte eine Bitmap oder PixelArray (ARGB) mit Hilfe der Datatypes speichern. Hat jemand einen kurzen Beispiel Code ? Meiner stürzt immer ab, evtl. poste ich ihn später, habe ich aber grade nicht griffbereit. Ich möchte auch gerne unabhängig vom Screen sein, denn ich will auch 24bit Bilder speichern können wenn ich einen 256 Farb Screen offen habe. Ich weiss, die Frage wurde bestimmt schon gestellt, aber ich finde nichts passendes. Ist es eigentlich auch möglich, z.B. mit dem JPEG Datatype in JPEG zu speichern, oder geht das nur in IFF-ILBM ? Danke! -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
06.02.2006, 13:49 Uhr thomas Posts: 7718 Nutzer |
Hier, die ersten vier: http://thomas-rapp.homepage.t-online.de/examples/ Gerade fällt mir auf, daß das save_pic-Beispiel noch einen Fehler hat: wenn NewDTObject fehlschlägt, muß newbm freigegeben werden. Zitat: Dann mußt du das Bild vorher selbst nach 24bit wandeln. Zitat: Theoretisch ja (sofern die entsprechende Datytype-Klasse speichern kann), leider unterstützt das die datatype.library nicht. Es gibt zwar im Aminet einen Ersatz, der Speichern unterstützt. Aber der basiert auf OS 3.1 und wird wohl nicht mehr weiterentwickelt, jedenfalls sind Erweiterungen von 3.9 nicht enthalten. Und du kannst einem Benutzer nicht zumuten, daß er nur für dein Programm einen wichtigen Teil des Betriebssystems ersetzt. Mit der jpeg.library kann man leicht JPEG-Bilder speichern. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
06.02.2006, 13:49 Uhr gni Posts: 1106 Nutzer |
Zitat:Roland Mainz hatte Beispielcode dafür. Den Code solltest Du im AmiNet finden. Leider kann ich Dir keine Suchbegriffe dafür nennen. Zitat:Die wenigsten Datatypes unterstützen Speichern in "ihrem" Format. Einer der es macht, ist zb. BMPdt.lha im Aminet. Die meistens anderen DTs reichen den Saverequest einfach durch und dann bekommst Du ein IFF-ILBM, selbst dann wenn Du explizit ein Nativ-Format haben wolltest. [ - Antworten - Zitieren - Direktlink - ] |
06.02.2006, 22:28 Uhr bubblebobble Posts: 707 Nutzer |
Ok, hier ist der Code:code:DEFTYPE.BitMapHeader *bmhd DEFTYPE.BitMap *newbm ... d.l = GetBitMapAttr_(*newbm,#BMA_DEPTH) If d <= 8 Then ncols.l = 1 LSL d : Else ncols = 0 ; neues DT Objekt anlegen *DTPic._Object = NewDTObjectA_ (0,Tags(#DTA_SourceType,#DTST_RAM,#PDTA_DestMode, #PMODE_V43,#DTA_GroupID,#GID_PICTURE,#PDTA_BitMap,*newbm,#PDTA_Remap,0 ) ) If *DTPic GetDTAttrsA_ *DTPic,Tags(#PDTA_BitMapHeader,&*bmhd) *bmhdbmh_Width = GetBitMapAttr_(*newbm,#BMA_WIDTH) *bmhdbmh_Height = GetBitMapAttr_(*newbm,#BMA_HEIGHT) *bmhdbmh_Depth = d ; oeffnen einer neuen Datei und schreiben mittels picture.datatype fh.l = Open_ (&filename.s,#MODE_NEWFILE) If fh succ = DoDTMethodA_ (*DTPic,0,0,Tags(#DTM_WRITE,0,fh,#DTWM_IFF)) Close_ fh EndIf ; entfernen des DT Objektes DisposeDTObject_ *DTPic EndIf Vielleicht fällt ja jemandem auf, was da schief läuft. Es crashed bei NewDTObjectA (). Die Bitmap in *newbm wurde korrekt erstellt und erfolgreich zum blitten verwendet, befindet sich also evtl. im Graka RAM. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
06.02.2006, 23:37 Uhr whose Posts: 2156 Nutzer |
@Thilo: Ich hab jetzt keine Ahnung, wie AmiBlitz mit Taglisten umgeht, aber ich vermisse da TAG_END... aus meiner C-Logik heraus würde ich sagen, daß da nach der 0 (was theoretisch einem PDTA_REMAP, FALSE gleichkäme) munter weiter Tags gelesen werden, die eigentlich nicht existieren. Ist aber auch gut möglich, daß das nicht das Problem ist, da ich ja, wie gesagt, nicht genau weiß, wie AmiBlitz mit Taglisten umgeht. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
06.02.2006, 23:42 Uhr bubblebobble Posts: 707 Nutzer |
Die Funktion Tag() erzeugt unter Amiblitz eine Tag Liste und gibt den Pointer darauf zurück. Die Listen sind immer mit TAG_END automatisch abgeschlossen. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
06.02.2006, 23:46 Uhr whose Posts: 2156 Nutzer |
@bubblebobble: Hm, dann weiß ich jetzt ad hoc auch nicht wirklich weiter... müßt ich morgen früh mal in meinen alten Quellen zu dem Thema schauen... wahrscheinlich ist Thomas aber wieder mal bedeutend schneller Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
07.02.2006, 12:33 Uhr thomas Posts: 7718 Nutzer |
@bubblebobble: Ich habe deinen Code mal 1:1 nach C übersetzt und es stürzt jedenfalls nicht ab. C code:#include <proto/dos.h> #include <proto/graphics.h> #include <proto/datatypes.h> #include <datatypes/pictureclass.h> int main (void) { struct BitMapHeader *bmhd; struct BitMap *newbm; long d; long ncols; Object *DTPic; BPTR fh; long succ; char filename[] = "ram:test.pic"; newbm = AllocBitMap (120,90,5,BMF_CLEAR,NULL); if (!newbm) { Printf ("AllocBitMap failedn"); return (20); } d = GetBitMapAttr(newbm,BMA_DEPTH); if (d <= 8) ncols = 1 << d; else ncols = 0; // neues DT Objekt anlegen DTPic = NewDTObject (NULL,DTA_SourceType,DTST_RAM,PDTA_DestMode,PMODE_V43,DTA_GroupID,GID_PICTURE,PDTA_BitMap,newbm,PDTA_Remap,FALSE,TAG_END ); if (DTPic) { GetDTAttrs (DTPic,PDTA_BitMapHeader,&bmhd); bmhd->bmh_Width = GetBitMapAttr(newbm,BMA_WIDTH); bmhd->bmh_Height = GetBitMapAttr(newbm,BMA_HEIGHT); bmhd->bmh_Depth = d; // oeffnen einer neuen Datei und schreiben mittels picture.datatype fh = Open (filename,MODE_NEWFILE); if (fh) { succ = DoDTMethod (DTPic,NULL,NULL,DTM_WRITE,0,fh,DTWM_IFF); Printf ("succ = %ldn",succ); Close (fh); } else Printf ("Open failedn"); // entfernen des DT Objektes DisposeDTObject (DTPic); } else Printf ("NewDTObject failedn"); return (0); } Da dein Programm beim ersten Aufruf der datatypes.library abstürzt, kann es sein, daß du die Library nicht geöffnet hast ? Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
07.02.2006, 13:09 Uhr bubblebobble Posts: 707 Nutzer |
@Thomas Vielen Dank für die Mühe! Ich hatte das aus einem C Quelltext nach AB2 portiert ;-) Wenn es bei dir läuft, müsste es entweder ein Problem der Pointer Indirektionen sein, oder vielleicht liegts auch an AfA, muss ich mal ausschalten. Die datatype.lib ist definitiv öffen, weil ich sie vorher schon benutzte um das Bild zu laden. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
07.02.2006, 15:46 Uhr Holger Posts: 8116 Nutzer |
@thomas: 1:1 ist das nicht. Die BitMap-Erzeugung ist definitiv anders, bubblebobble spricht von GraKa, benutzt also eine RTG-BitMap... mfg [ Dieser Beitrag wurde von Holger am 07.02.2006 um 15:50 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
07.02.2006, 15:57 Uhr whose Posts: 2156 Nutzer |
Zitat: Er schrieb "liegt evtl. im GraKa-RAM". Für mich sieht das aber auch mehr danach aus, als gäbs da ein Problem mit AmiBlitz (wie Thilo schon meinte evtl. bzgl. AfA). Abgesehen davon, der Code von Thomas tut auch seinen Dienst, wenn man die Bitmap als Friend einer GraKa-Bitmap allokiert, daran sollte es also nicht hapern Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
09.02.2006, 00:24 Uhr bubblebobble Posts: 707 Nutzer |
Ok, der Code funktioniert jetzt, nur mit Bitmaps der Tiefe <=8. Geht das etwa nicht mit 24 bit ? -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
14.02.2006, 13:25 Uhr bubblebobble Posts: 707 Nutzer |
Hilfe! (hiermit rücke ich den Thread wieder hoch ;-) Kann mir denn niemand sagen, ob man mit den Datatypes Bild >8bit speichern kann ? Wenn das so ist, kann ich ja lange rumproieren. <=8bit habe ich schon erfolgreich gespeichert aber >8bit nicht. Dann schreibe ich doch lieber selbst einen IFF saver. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
14.02.2006, 19:37 Uhr Blackbird Posts: 634 Nutzer |
@bubblebobble: ich denke das kommt auf den datatype an, das werden wohl nicht alle unterstützen. aber iff und png sollte schon funktionieren... -- regards Blackbird Have a look at: http://www.blackbird-net.de Skins for PlayCD OS3.9 BlackShoot, Zombies Apocalypse, GalagaWars PerfectPaint [ - Antworten - Zitieren - Direktlink - ] |
14.02.2006, 19:39 Uhr bubblebobble Posts: 707 Nutzer |
Gespeichert wird sowieso immer als IFF. Siehe obigen Code. Er funktioniert aber nur mit Bitmaps <=8 bitplanes. Ansonsten wird kein Bild gespeichert, der Body Chunk bleibt leer und der Rechner wird instabil. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
21.02.2006, 15:18 Uhr Holger Posts: 8116 Nutzer |
Zitat: Mmm, wollte es mal ausprobieren, habe aber jetzt das gleiche Problem, das Du vorher hattest, es stürzt einfach nur ab. Woran lag das denn bei Dir, bzw. was hast Du am code seit dem geändert? mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
21.02.2006, 16:35 Uhr bubblebobble Posts: 707 Nutzer |
Weiss jetzt auch nicht mehr genau. Zwei Fehlerquellen waren: 1. Die bitmap wird von Datatype freigegeben, das muss man beachten. 2. AfA ausschalten, vielleicht liegts daran, war aber nur ein verdacht Ich poste nachher mal meine Source, der funktioniert, zumindest mit <=8 bitmaps. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Speichern via Datatypes | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |