amiga-news 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:
TAGLIST workbuf&, _
bsa_SrcX%,0 ,_
...
TAG_END&


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:
bsa_SrcWidth%, pwidth%, _
bsa_SrcHeight%, pheight%,_
...
bsa_DestWidth%, VARPTR(destwidth%),_
bsa_DestHeight%,VARPTR(destheight%),_


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:
tempbm& = AllocBitMap& (pwidth%+400, pheight%+400, 24&, NULL&, NULL&)

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