ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > BitMapScale | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
05.06.2007, 22:30 Uhr MaikG Posts: 5172 Nutzer |
Wie verwendet man BitmapScale? Ich habe ein Bild von über Datatypes geladen, unabhängig vom Bild möchte ich z.B. eine Bitmap mit 100x100 Pixeln. Ja, das folgende Programm macht Enforcer hits aber kein Bild. Ich denke da sind entweder Parameter die falsch sind oder ich muss wieder irgendwas als Pointer und nicht als Wert oder umgekehrt übergeben. Die Parameter mit Factor verstehe ich nicht. code:workbuf& = AllocVec& (1024, MEMF_PUBLIC& OR MEMF_CLEAR&) '---------- Bild laden --------- IF workbuf& THEN TAGLIST workbuf&, _ DTA_SourceType&, DTST_FILE&, _ DTA_GroupID&, GID_PICTURE&, _ PDTA_Screen&, mysc&, _ PDTA_Remap&, TRUE&, _ PDTA_DestMode&, 1&, _ 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%) tempbm& = AllocBitMap& (pwidth%+400, pheight%+400, 24&, NULL&, NULL&) TAGLIST workbuf&, _ bsa_SrcX%,0 ,_ bsa_SrcY%,0 ,_ bsa_SrcWidth%, pwidth%, _ bsa_SrcHeight%, pheight%,_ bsa_XSrcFactor%, 100,_ bsa_YSrcFactor%, 100,_ bsa_DestX%, 0,_ bsa_DestY%, 0,_ bsa_DestWidth%, VARPTR(destwidth%),_ bsa_DestHeight%,VARPTR(destheight%),_ bsa_XDestFactor%, 50,_ bsa_YDestFactor%, 50,_ bsa_SrcBitMap%, bitmapadr&, _ bsa_DestBitMap%, tempbm&,_ bsa_Flags%, Null&,_ TAG_END& BitMapScale(workbuf&) junk& = BltBitMapRastPort& (tempbm&, 0, 0, rp&, 112, 6+thetopborder%, destwidth%, destheight%, &HC0) FreeBitMap tempbm& END IF END IF FreeVec gplayout& END IF DisposeDTObject dtobjekt& END IF FreeVec workbuf& END IF [ - Antworten - Zitieren - Direktlink - ] |
05.06.2007, 23:30 Uhr thomas Posts: 7717 Nutzer |
Zitat: Da hast du etwas falsch verstanden. BitMapScale nimmt keine Tag-Liste, sondern eine Struktur. Da muß sowas hin wie workbuf& = AllocVec (bsa_SizeOf) pokew workbuf& + bsa_SrcX%,0 pokew workbuf& + bsa_SrcY%,0 ... Zitat: Und wenn du schon unschlüssig bist, ob Pointer oder Werte richtig sind, dann solltest du dich wenigstens für eins entscheiden. Beides mischen kann nicht gehen. Tipp: Werte sind richtig. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
05.06.2007, 23:39 Uhr thomas Posts: 7717 Nutzer |
Und wo wir schonmal dabei sind, Zitat: Das haut so auch nicht hin. Wenn du eine Bitmap mit einer Farbtiefe größer als 8 anlegen möchtest, dann mußt du bei den Flags das Pixelformat mit angeben. Und du mußt BMF_MINPLANES setzen, sonst bekommst du zumindest bei Cybergraphics trotzdem eine 8bit-Bitmap. In C sieht das so aus: AllocBitMap (width,height,24,BMF_MINPLANES|BMF_SPECIALFMT|SHIFT_PIXFMT(PIXFMT_RGB24),NULL); Dazu kommt noch, daß BitMapScale nur mit 8bit-Bitmaps funktioniert. Wenn du Truecolor-Bilder skalieren möchtest, solltest du ScalePixelArray oder die entsprechende Picasso96-Funktion benutzen. Hier ist noch ein Beispiel für BitMapScale in C: code:struct BitMap *scale_8bit (struct BitMap *srcbm,long srcw,long srch,long destw,long desth) { struct BitScaleArgs *bsargs; struct BitMap *destbm; if (destbm = AllocBitMap (destw,desth,GetBitMapAttr(srcbm,BMA_DEPTH),GetBitMapAttr(srcbm,BMA_FLAGS),srcbm)) { if (bsargs = AllocMem (sizeof (struct BitScaleArgs),MEMF_CLEAR)) { bsargs->bsa_SrcWidth = srcw; bsargs->bsa_SrcHeight = srch; bsargs->bsa_XSrcFactor = srcw; bsargs->bsa_XDestFactor = destw; bsargs->bsa_YSrcFactor = srch; bsargs->bsa_YDestFactor = desth; bsargs->bsa_SrcBitMap = srcbm; bsargs->bsa_DestBitMap = destbm; BitMapScale (bsargs); FreeMem (bsargs,sizeof (struct BitScaleArgs)); return (destbm); } FreeBitMap (destbm); } return (NULL); } Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
06.06.2007, 09:56 Uhr srupprecht Posts: 39 Nutzer |
@thomas: BS() funktioniert mit jeder BitMap Tiefe. [ - Antworten - Zitieren - Direktlink - ] |
06.06.2007, 10:06 Uhr MaikG Posts: 5172 Nutzer |
Mh, Strucktur das war wohl sowas was verwendet wurde bevor man die Taglists erfunden hatte? Okay damit geht es und die Parameter hab ich auch kapiert. >Das haut so auch nicht hin. Wenn du eine Bitmap mit einer Farbtiefe >größer als 8 anlegen möchtest, dann mußt du bei den Flags das >Pixelformat mit angeben. Und du mußt BMF_MINPLANES setzen, sonst >bekommst du zumindest bei Cybergraphics trotzdem eine 8bit-Bitmap. Also bei 100% sieht das Bild so aus wie vorher, wird von den Datatypes für den Screen/Window vorgefertigt. >AllocBitMap (width,height,24,BMF_MINPLANES|BMF_SPECIALFMT|SHIFT_PIXFMT(PIXFMT_RGB24),NULL); Okay, werd ich korregieren. Hab gestern nur mit ein 8 Bit bild probiert, muss ich mal mehr reinschicken. [ - Antworten - Zitieren - Direktlink - ] |
06.06.2007, 11:34 Uhr Der_Wanderer Posts: 1229 Nutzer |
@Thomas ScalePixelArray() funktioniert mit PixelArrays, BitMapScale() mit Bitmaps. Beide funktionieren mit 8, 16 und 24bit. Nur ScalePixelArray funktioniert nicht auf planaeren Daten, es muss LUT (8bit chunky), Hi oder True Color sein. -- 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 - ] |
06.06.2007, 11:38 Uhr MaikG Posts: 5172 Nutzer |
Also ich hab die Routine so wie sie war(Alloc ohne FMT/BitMapScale) mit 24-Bit gestestet, es ging. Cyberguard hits kamen keine also müsste das doch so okay sein? [ - Antworten - Zitieren - Direktlink - ] |
07.06.2007, 10:02 Uhr MaikG Posts: 5172 Nutzer |
Habs jetzt mit sehr vielen Bildern probiert, keine Probleme. Danke @all [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > BitMapScale | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |