DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > Alphamaske aus PNG und IFF laden | [ - Search - New posts - Register - Login - ] |
-1- 2 3 | [ - Post reply - ] |
2005-08-14, 23:06 h bubblebobble Posts: 707 User |
Hallo Alle! Weiss jemand wie man die Alphamaske aus PNG und/oder IFF-ILBM Grafiken laden kann ? Datatypes (bzw. via guigfx) scheint das nicht zu unterstüten ? Wie machen das die PNG Icons ? -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2005-08-15, 10:01 h gni Posts: 1106 User |
Zitat:Vermutlich mit einer eigenen Laderoutine, die die libpng direkt benutzt. [ - Answer - Quote - Direct link - ] |
2005-08-15, 11:09 h bubblebobble Posts: 707 User |
Gibt es die als Amiga Shared Lib mit Doku irgendwo ? Weis jemand, ob das IFF-ILBM Format offiziell Alpha Channel unterstützt ? ArtEffects schreibt einen "ALPHA" Chunk in die IFF Dateien, ist das eine eigene Erfindung oder gibt es andere Programme oder Datatypes, die das Unterstützen ? -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2005-08-15, 11:53 h gni Posts: 1106 User |
Zitat:Nicht das ich wüßte. Zitat:DTs können ohne weiteres den Alpha-Kanal laden. Nur was dann damit machen? [ - Answer - Quote - Direct link - ] |
2005-08-15, 12:46 h DariusBrewka Posts: 899 [Banned user] |
Zitat: z.B. mit DoMethod(...PDTM_READPIXELARRAY,...PixelFormat = PBPAFMT_ARGB) den User ermöglichen etwas von dem Kanal zu haben? Tschuldigung, das "Nur was dann damit machen?" ist eine ziemlich blöde Antwort. Ich könnte das sehr gut gebrauchen und muss auf 68K die Maske immer als zusätzliche Datei speichern. AROS kann das ja und so schwierig das in 68 zu implementieren kann das wohl auch nicht sein. [ - Answer - Quote - Direct link - ] |
2005-08-15, 13:07 h bubblebobble Posts: 707 User |
Die Datatypes laden zwar den Alphakanal, und nutzen den wenn man über das Datatype blittet. Aber es gibt wohl unter OS3.x keine Funktion um an die Alphamaske innerhalb der Bitmap oder ByteArray zu kommen. Man kann die Bitmap immer nur ohne Alphamaske bekommen. z.B. ARGB als Pixelformat hinzufügen würde schon reichen. Das picture.datatype von OS4 kann das wohl. Wenn das AROS picture.datatype das auch kann, könnte man das doch evtl. für OS3.x kompilieren, oder nicht ? [ Dieser Beitrag wurde von bubblebobble am 15.08.2005 um 13:32 Uhr editiert. ] [ - Answer - Quote - Direct link - ] |
2005-08-15, 17:27 h gni Posts: 1106 User |
Zitat:Welcher picture.datatype unterstützt PBPAFMT_ARGB? Zitat:Warum? Wenn der picture.datatype damit nichts anfangen kann, muß/kann ich den Alpha-Kanal auch nicht berücksichtigen. Zitat:Ich bezweifle auch nicht, das ALPHA nutzlos ist. Ich weis nur nicht, wie ein DT diese Information weitergeben soll bzw. behandeln soll, da meines Wissens PBPAFMT_ARGB nicht unterstützt wird. [ - Answer - Quote - Direct link - ] |
2005-08-15, 17:30 h gni Posts: 1106 User |
Zitat:Möglicherweise. Nur mußt Du dem garantiert noch beibringen CyberGraphics Funktionen zu verwenden. Ich vermute, das wäre eine schwieriges Unterfangen. [ - Answer - Quote - Direct link - ] |
2005-08-15, 17:38 h DariusBrewka Posts: 899 [Banned user] |
Zitat: Was meinst du mit unterstützt PBAFMT_ARGB?, also aufrufen kann ich das immer und bekomme auch ein 32 Bit Image heraus nur ist dann das Alpha==0, also Sinnlos. Auf AROS liefert das Picture datatype allerdings schon ein echtes ARGB Format mit Alphakanal. Mein Programm würde sonst auch nicht laufen! Zitat: Hoffe zuerst einmal dass du dich verschrieben hast, andererseites s.O. geliefert wird ARGB mit A=0, so schwer zu sein dürfte es doch wirklich nicht auch das Alpha zu liefern, aber warum wird das nicht gemacht? Alpha gibt's schon seit zig Jahren. [ - Answer - Quote - Direct link - ] |
2005-08-15, 17:43 h bubblebobble Posts: 707 User |
@DariusBrewka: Ist das dann die Schuld des PNG Datatypes oder der picture.datatype, dass der Alpha zu Null gesetzt wird ? Mein PNG Datatype liest den Alpha Kanal, das kann mandaran erkennen, dass Multiview die "transpatenten" Teile des Bilder schwarz macht. Nur wird dieser Alphakanal eben nicht an die Bitmap weitergereicht. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2005-08-15, 17:45 h DariusBrewka Posts: 899 [Banned user] |
Zitat: hmm, weder CGX noch P96 unterstützen auf 68k Alpha, aber für DoMethod(...ReadPixels, ..FMT_ARGB32) braucht man dass nicht und den Alphakanal auch in DoMethod(..DRAW)) einzubeziehen ist nun wirklich nicht so schwer. Ich weiss wirklich nicht warum das nicht gemacht wurde, ggf sollte man sich wirkich an das AROS picture datatype setzen und es für 68k compilieren? [ - Answer - Quote - Direct link - ] |
2005-08-15, 17:54 h DariusBrewka Posts: 899 [Banned user] |
Zitat: also ich denke wenn das png.datatype alpha liesst dann muss es ein Problem des picture.datatypes sein, ich habe ja vorhin auch das WarpPNG.datatype installiert und habe mich gefreut, leider ging es aber auch nicht. Andererseits bedeutet ein schwarzer Hintergrund auch nicht das Alpha geladen wurde, es kann einfach nur der Hintergrund schwarz sein, da ja die Alpha Werte für diese auszumaskierenden Pixel 0 sind und es dann keinen Sinn machen würe anderes als 0x000000 für ARGB zu nehmen, ausser man möchte das das File nicht so gut gepackt wird. Und dieses 0 für RGB ist halt dann Schwarz. [ - Answer - Quote - Direct link - ] |
2005-08-15, 18:04 h Anjis Posts: 8 User |
@DariusBrewka: Hallo Darius :-) Ich würde mich sehr freuen wenn Du mir hierzu was sagen könntest. http://www.amiga-news.de/forum/thread.php3?id=18459&BoardID=1 Vielen Dank Anjis [ - Answer - Quote - Direct link - ] |
2005-08-15, 18:06 h bubblebobble Posts: 707 User |
@DariusBrewka: Nein, die PNG Datei hat einen ganz normalen Hintergrund mit verschiedenen Farben. Es gibt ein Vordergrundobjekt, was ich mit der Alphamaske als sichtbar (A=255) definiert habe und den Hitnergrund als transparent (A=0). Wenn ich das Bild jetzt mit Multiview anzeigen lassen, dann wurde der ehemals Farbige Hintergrund in Schwarz gefadet, je nach Alpha Wert eben. D.h. das Datatype hat definitiv die Alpha Maske geladen und das Bild auf einen Schwarzen Hintergrund unter berücksichtigung der Alphamaske geblittet. Nur die Maske ansich bekomme ich eben nicht. Bei dem kürzlich erschienen DT kann man das einstellen (USE, DISCARD und KEEP). -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2005-08-15, 19:53 h DariusBrewka Posts: 899 [Banned user] |
@bubblebobble OK, sagen wir es geht (noch) nicht, ich habe ja darum auch früher die Masken als externe Datei geladen. Ggf. wenn du Powericons installiert hast und die PNGs in xyz.info umnennen kannst kannst du über die icon.library die dateien laden oder über die scalos iconobject.library? ist nicht allzu schwer, dann kannst du Provisorisch dein Program weitermachen und später dann auf datatype umstellen. Sowohl mit der icon.lib als auch iconobject.library+datatypes kannst du sowohl die PNGs mit Alphakanal malen als auch die ARGB daten erhalten. [ - Answer - Quote - Direct link - ] |
2005-08-15, 20:19 h bubblebobble Posts: 707 User |
Hast du beispiel Code Schnipsel wie ich aus dem icon eine Bitmap mache ? Ist man wirklich gezwungen, die Datei in .info umzubenennen oder geht das irgendwie anders ? Allerdings muss man PNGIcons installiert haben, richtig ? Ich glaube fast, ich werde einen eigenen Alpha Loader schreiben müssen. Oder gibt es ein Shell Tool was Alphakanäle extrahieren kann ? Dann könnte man das beim start immer über das Grafik Verzeichnis laufen lassen, und so wie Alphamasken automatisch akutell halten. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2005-08-15, 21:03 h Holger Posts: 8116 User |
Zitat:Nichtmal das, also zumindest im Falle von PowerIcons. Das benutzt eigene Laderoutinen, die besser optimiert sein sollen, dafür aber auch nicht alle png-typen unterstützen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2005-08-15, 21:14 h DariusBrewka Posts: 899 [Banned user] |
Zitat: aus einem icon eine Bitmap zu machen ist keine wirkliche Kunst. Speicher für einen Rastport erzeugen, eine Bitmap allokieren mit format ARGB, die Bitmap an den Rastport hängen und dann mittels Drawiconstate(...) hineinzeichnen, allerdings wist du damit auch keine Alphachannels bekommen die du weiterbearbeiten kannst, das Icon wird aber mit dem Hintergrund in der Bitmap die du an den RastPort anhängst verknüpft. Willst du das Image nur zeichnen oder wirklich weiterbearbeiten?, bei ersterem brauchst du nicht wirklich viel, einfach dass Icon laden und mittels DrawIconState() zeichnen. Brauchst du die Daten incl. Alpha dann ist es auch nicht so schwer, da sowohl der Powericons Patch die icon.lib so patcht, als auch iconobject (Scalos), dass du diese Daten erhälst (im Format ARGB32), daraus eine Bitmap zu machen sollte auch nicht so schwer sein, leider wirst du davon nichts haben, da keine Funktion die Alpha Werte benutzt. Zitat: ja, da die icon.library das ".info" selber dranhängt und sich davon nicht abhalten lässt. Zitat: PowerIcons!, dann hat man aber die schönen Png icons incl. Zitat: sieht so aus, andererseits von wem stammt denn das pictue.datatype oder gibt es davon auch private (nicht C=, Haage&Partner...) versionen. Dann könnte man dort anfragen. [/quote] [ - Answer - Quote - Direct link - ] |
2005-08-15, 21:28 h Holger Posts: 8116 User |
Zitat:Also, erstmal wäre es ziemlich sinnlos, wenn die datatypes.library hingehen würde, sich vom png.datatype die ARGB-Daten holen würde, um dann den A-Teil mit nullen zu füllen. Außerdem könntest Du ja, wenn das wirklich so wäre, einfach den Request direkt an das datatype schicken, ohne überhaupt mit der library zu reden. Wahrscheinlicher ist es, daß sich die library RGB-Daten von png-datatype holt und dann nach ARGB konvertiert. Wenn die Schnittstelle Datatype und der Library keinen anderen Austausch zuläßt, nützt es nix, wenn das Datatype die Alpha-Werte vorhält. Das Zeichnen in eine BitMap ist ein ganz anderer Request. Du kannst natürlich das Bild einmal in eine schwarz vorinitialisierte BitMap und danach in eine weiße BitMap blitten und die Differenz ermitteln... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ Dieser Beitrag wurde von Holger am 15.08.2005 um 21:30 Uhr editiert. ] [ - Answer - Quote - Direct link - ] |
2005-08-15, 22:40 h Georg Posts: 107 User |
Zitat: Nicht unbedingt empfehlenswert, weil es bei dem an anderen Stellen noch mangelt. Wie unimplementierte Features. Oder v43 <-> pre-v43 Kompatibilität-Kram (wenn ein datatype die daten an picture.datatype im v43 modus weitergibt aber ne app darauf im pre-v43 modus zugreift). [ - Answer - Quote - Direct link - ] |
2005-08-15, 22:50 h Georg Posts: 107 User |
Zitat: Mit libpng coden (Bilder laden/speichern) ist extrem einfach. Unter Linux wird under der man page von libpng genau und Schritt für Schritt beschrieben wie man das macht. Ansonsten kann man sich auch den Source vom AROS png.datatype anschauen, der auf libpng basiert. Der hat außerdem noch ein paar zusätzliche Funktionen um mit sehr wenigen Code Zeilen ein PNG File in einen ARGB Buffer zu laden. Diese Funktionen werden von der icon.library zum laden von PNG Icons verwendet (= ohne datatype overhead). [ - Answer - Quote - Direct link - ] |
2005-08-15, 23:17 h bubblebobble Posts: 707 User |
Ich habe die Datatypes noch nicht ganz aufgegeben. Wie kann ich aus einem Datatype Object eine Bitmap, am besten ein simples PixelArray herausquetschen ? Es war die Rede von PDTM_READPIXELARRAY in Kombination mit PBFMT_ARGB. Kann da jemand etwas genaueres posten, etwa den entpsrechenden Aufruf mit DoDTMethod ? Ich sehe gute chancen, dass das Datatype dann die Alphamaske tatsächlich mit herausgibt. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2005-08-16, 00:04 h Georg Posts: 107 User |
Zitat: Vom guigfx source: NewDTObject(file_name, PDTA_DestMode, PMODE_V43, DTA_SourceType, DTST_FILE, DTA_GroupID, GID_PICTURE, PDTA_Remap, FALSE, TAG_DONE) [...] GetDTAttrs(obj, PDTA_ModeID, (IPTR)&displayID, PDTA_BitMapHeader, (IPTR)&bmhd, TAG_DONE) [...] wenn bmhd->bmh_Depth > 8: if ((pic.array = AllocRenderVec(MemHandler, 4 * pic.width * pic.height))) { DoMethod(obj, PDTM_READPIXELARRAY, (IPTR)pic.array, RECTFMT_ARGB, pic.width * 4, 0,0, pic.width, pic.height); } [ - Answer - Quote - Direct link - ] |
2005-08-16, 00:46 h bubblebobble Posts: 707 User |
@Georg: Ich mache das eigneltich sehr ähnlich, aber mein Rechner stürzt gnadenlos ab bei DoDTMethod: Hier der Code (leider AB2, ich hoffe das ist verständlich): code:Sieht da jemand was ich falsch mache ? Habe schon alles Mögliche probiert.*DTPic._Object = NewDTObjectA_ (&filename.s,Tags(#DTA_GroupID,#GID_PICTURE )) If *DTPic GetDTAttrsA_ *DTPic,Tags(#PDTA_BitMapHeader,&*bmhdp) temp.l = AllocMem_(*bmhdbmh_Width * *bmhdbmh_Height*4,0) DTMMethodID = #PDTM_READPIXELARRAY DTMpbpa_PixelData = temp ; /* The pixel data to transfer to/from */ DTMpbpa_PixelFormat = #RECTFMT_ARGB ; #PBPAFMT_ARGB ; /* Format of the pixel data (see "Pixel Formats" below) */ DTMpbpa_PixelArrayMod = *bmhdbmh_Width*4; /* Number of bytes per row */ DTMpbpa_Left = 0 ; /* Left edge of the rectangle to transfer pixels to/from */ DTMpbpa_Top = 0 ; /* Top edge of the rectangle to transfer pixels to/from */ DTMpbpa_Width = *bmhdbmh_Width ; /* Width of the rectangle to transfer pixels to/from */ DTMpbpa_Height = *bmhdbmh_Height DoDTMethodA_ *DTPic,0,0,DTM ... Die Breite und Höhe (*bmhdbmh_width) stimmen, also wird das Bild wohl korrekt geöffnet. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2005-08-16, 08:11 h DariusBrewka Posts: 899 [Banned user] |
Also ich habe ja vor einiger Zeit eine lib gemacht, die genau dieses macht für mein Programm (wird aber nicht benutzt, da ich diese Funktionen auch intern habe), das einzige was fehlt sind die fd files um daraus Includes für die Verschiedenen Compiler zu erstellen. Später habe ich noch kleine Fehler gefunden, die kann ich aber sicherlich schnell beheben. Diese hat folgende Funktionen (der APTR Parameter am Anfang ist ein Memorypool, wo der Speicher alloziiert werden soll). code:void DisposeImageContainer(APTR, struct NewImage *); void DrawAlphaImageToRP(APTR, struct RastPort *, struct NewImage *, UWORD, UWORD); void DrawAlphaDisabledImageToRP(APTR, struct RastPort *, struct NewImage *, UWORD, UWORD); void DrawTileToRP(APTR, struct RastPort *, struct NewImage *, UWORD, UWORD, UWORD, UWORD); void DrawImageToRPScaled(APTR, struct RastPort *, struct NewImage *, UWORD, UWORD, UWORD, UWORD, UWORD, UWORD, UWORD, UWORD); void DrawImageToRP(APTR, struct RastPort *, struct NewImage *, UWORD, UWORD); void PutImageToRP(APTR, struct RastPort *, struct NewImage *, UWORD, UWORD); struct NewImage *NewImageContainer(APTR, UWORD, UWORD); struct NewImage *GetImageFromRP(APTR, struct RastPort *, UWORD, UWORD, UWORD, UWORD); struct NewImage *GetImageFromFile(APTR, char *); BOOL ScaleImageToImage(APTR, struct NewImage *, struct NewImage *); void SetImage(APTR, struct NewImage *, ULONG); void MixImage(APTR, struct NewImage *, struct NewImage *, UWORD, UWORD, UWORD, UWORD, UWORD); void BlurSourceTintAndMixTexture(APTR, struct NewImage *, struct NewImage *, UWORD, ULONG); void TintImage50(APTR, struct NewImage *, ULONG); NewImage ist eine kleine Struktur, die nur die breite und höhe des Images enthält und die Daten selber, sonst praktisch nichts, Die DrawAlphaImageToRP funktion braucht viel Speicher, da diese zuerst den Bildhintergrund einliest, ihn mit dem Bild verknüpft und wieder zurückschreibt (war halt nur für kleine Iages gedacht). gruss. Darius [ - Answer - Quote - Direct link - ] |
2005-08-16, 08:32 h thomas Posts: 7718 User |
@bubblebobble:Zitat: Ich weiß nicht genau, was das für eine Sprachs ist, aber aus dem Rest der da steht, würde ich sagen, du mußt entweder code:oderDoDTMethodA_ *DTPic,0,0,&DTM code:benutzen, weil DTM offenbar kein Pointer ist, sondern die Struktur selber. DoDTMethodA braucht aber einen Pointer auf die Methode.DoDTMethod_ *DTPic,0,0,DTM Wie sieht denn dein Aufruf von DTM_PROCLAYOUT aus ? Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Answer - Quote - Direct link - ] |
2005-08-16, 10:01 h bubblebobble Posts: 707 User |
@Darius Die Lib wäre natürlich interessant, wenn man tatsächlich an den Alphachannel kommt. Allerdings habe ich selbst eine Bibliothek mit vielen Befehlen zum Blitten geschieben, die keinen MEmory overhead hat, sondern die Daten direkt auf der Graka mischt. (Evtl. ist das langsamer) (wahlweise mit Maske, scaliert, mit Alpha, Add (für Lichteffekte), Sub (für Schatten), beliebig Transparent etc. Das einzige was mir fehlt sind die Daten der Alphamaske eines .iff oder .png. Würdest du mir verraten wie du die Daten aus dem Datatype bekommst, oder machst du das anders ? DPM ist eine Structure vom Typ pdtBlitPixelArray. Wenn man DTM schreibt, ist das gleichwertig mit &DTM, also ein Pointer auf das erste Element der Structur, in dem Fall MethodID. > Wie sieht denn dein Aufruf von DTM_PROCLAYOUT aus ? Das rufe ich überhaupt nicht auf. Ich mache nur das, was ich oben gepostet habe. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2005-08-16, 10:30 h Georg Posts: 107 User |
Zitat: Ruf mal die PDTM_READPIXELARRAY Methode mit DoMethod auf, anstatt DoDtMethod. DoDtMethod benutzt man sonst, wenn das DataType Objekt schon an ein Fenster gehängt ist. [ - Answer - Quote - Direct link - ] |
2005-08-16, 10:47 h gni Posts: 1106 User |
Zitat:Ich meinte, das der picture.datatype dieses Format auch verarbeiten kann und nicht auf _RGB besteht. Zitat:Sollte natürlich heissen, das Alpha nicht nutzlos ist...Zitat:Hoffe zuerst einmal dass du dich verschrieben hast [ - Answer - Quote - Direct link - ] |
2005-08-16, 10:53 h gni Posts: 1106 User |
Zitat:Hast Du auch einen Link? [ - Answer - Quote - Direct link - ] |
-1- 2 3 | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Alphamaske aus PNG und IFF laden | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |