amiga-news 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: 7716
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:
ich will auch 24bit Bilder speichern können wenn ich einen 256 Farb Screen offen habe.

Dann mußt du das Bild vorher selbst nach 24bit wandeln.

Zitat:
Ist es eigentlich auch möglich, z.B. mit dem JPEG Datatype in JPEG zu speichern, oder geht das nur in IFF-ILBM ?

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:
bubblebobble:
Ich möchte eine Bitmap oder PixelArray (ARGB) mit Hilfe der Datatypes speichern. Hat jemand einen kurzen Beispiel Code?

Roland Mainz hatte Beispielcode dafür. Den Code solltest Du im AmiNet finden. Leider kann ich Dir keine Suchbegriffe dafür nennen.
Zitat:
Ist es eigentlich auch möglich, z.B. mit dem JPEG Datatype in JPEG zu speichern, oder geht das nur in IFF-ILBM ?
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)
  *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.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

--
---

:boing: µA1 PPC 750GX-800
:boing: 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 :D

Grüße

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

07.02.2006, 12:33 Uhr

thomas
Posts: 7716
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 failed\n");
	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 = %ld\n",succ);
		Close (fh);
		}
	else
		Printf ("Open failed\n");

	// entfernen des DT Objektes
	DisposeDTObject (DTPic);
	}
else
	Printf ("NewDTObject failed\n");

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:
Original von Holger:
@thomas:
1:1 ist das nicht. Die BitMap-Erzeugung ist definitiv anders, bubblebobble spricht von GraKa, benutzt also eine RTG-BitMap...


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 I-)

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: 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:
Original von bubblebobble:
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.


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.
.