Grabsprite

Previous topic - Next topic

ampos

I am trying to get a portion of a sprite, but the Y coord of grabsprite is crazy...

(for saving portions of sprites, this sprites are bigger than screen resolution)

Code (glbasic) Select

LOADSPRITE "sprite.png",1
GETSPRITESIZE 1,sx,sy
CREATESCREEN 1,2,sx,sy
USESCREEN 1;DRAWSPRITE 1,0,0;USESCREEN -1
USESCREEN 1
GRABSPRITE 3,0,0,100,100
USESCREEN -1
DRAWSPRITE 3,0,0 (or SAVESPRITE "test.png",3)
SHOWSCREEN


The grabbed/saved sprite has the Y coord wrong.

In my program, I have to make GRABSPRITE 3,0,-70,100,100, but I have found that the value 70 changes with sprite.png size...

(my sprites are 768x1024, 2000x3000,...)

If I make a SAVESPRITE "test.png",2 the saved sprite is fine, so the bug is in GRABSPRITE

Tested only in windows, as it is a internal edit (image crop) tool.

Here is the full function

Code (glbasic) Select
FUNCTION recorta_vineta: czona
LOCAL k$,x,y=0,xwin,ywin,f$,sx,sy,z,x1,x2=5,y1,y2=5,yt,z1,z2,tu,xres,yres

        GETSCREENSIZE xres,yres
xwin=xres/2;ywin=yres-100

f$=mpat$+"01.jpg"

LOADSPRITE f$,1
GETSPRITESIZE 1,sx,sy
CREATESCREEN 1,2,sx,sy
USESCREEN 1;DRAWSPRITE 1,0,0;USESCREEN -1
yt=(yres/2)+105

REPEAT;UNTIL MOUSEAXIS(3)=0
REPEAT
DRAWRECT 0,0,xres,yres,RGB(30,30,30)
DRAWRECT xwin-1,0,2,ywin,RGB(100,100,100)
DRAWRECT xwin,(yres/2)+100,xwin,2,RGB(100,100,100)
PRINT "Curs-Mueve Imagen |"+x+" "+y,xwin,yt,1
PRINT "Raton Izq y Der: recorta viñeta",xwin,yt+25,1

mira_mouse()

IF mouse.b1=1 AND mouse.x<xwin
x1=mouse.x+x;y1=mouse.y+y
ENDIF
IF mouse.b2=1 AND mouse.x<xwin
x2=mouse.x+x;y2=mouse.y+y
ENDIF

IF x2<=x1 THEN x2=x1+1
IF y2<=y1 THEN y2=y1+1

tu=KEY(42)+KEY(54)

GETSPRITESIZE 1,sx,sy
IF KEY(203)=1 THEN DEC x,1+(tu*16)
IF KEY(205)=1 THEN INC x,1+(tu*16)
IF KEY(200)=1 THEN INC y,1+(tu*16)
IF KEY(208)=1 THEN DEC y,1+(tu*16)
IF x<0 THEN x=0
IF x>(sx-xwin) THEN x=sx-xwin
IF y<0 THEN y=0
IF y>(sy-yres) THEN y=sy-yres

VIEWPORT 0,0,xwin-1,yres
DRAWSPRITE 1,-x,-y

DRAWLINE x1-x,y1-y,x2-x,y1-y,RGB(255,255,0)
DRAWLINE x2-x,y1-y,x2-x,y2-y,RGB(255,255,0)
DRAWLINE x2-x,y2-y,x1-x,y2-y,RGB(255,255,0)
DRAWLINE x1-x,y2-y,x1-x,y1-y,RGB(255,255,0)

USESCREEN 1
GRABSPRITE 3,x1,y1-70,x2-x1,y2-y1
GRABSPRITE 3,0,0,100,100
USESCREEN -1
VIEWPORT xwin+1,5,xwin-2,(yres/2)+96
GETSPRITESIZE 3,sx,sy
z1=(xwin-2)/sx;z2=((yres/2)+96)/sy
z=MIN(z1,z2)
IF z>1 THEN z=1
IF z<>1
ZOOMSPRITE 3,(-sx*(1-z))/2,(-sy*(1-z))/2,z,z
ELSE
DRAWSPRITE 3,0,0
ENDIF
USESCREEN -1
SHOWSCREEN
UNTIL k$="q"

ENDFUNCTION

MrTAToad

-70 would make no sense as it requires x,y,width and height coordinates.

Can you make the image available ?  And also, I see that you are using JPEG's  :puke:

ampos

If You see the example you have to sub 70 to the starting y coord of grabsprite. Also itcfailscwith jpgs and pngs. Any image you have will "work"

MrTAToad

#3
It does seem a bit odd - I'll have to have a look :)

Okay, give this a go :

Code (glbasic) Select
TYPE tMouse
x
y
b1
b2
ENDTYPE

GLOBAL mouse AS tMouse
GLOBAL mpat$

recorta_vineta(1)
END

FUNCTION recorta_vineta: czona
LOCAL k$,x,y=0,xwin,ywin,f$,sx,sy,z,x1,x2=5,y1,y2=5,yt,z1,z2,tu,xres,yres

        GETSCREENSIZE xres,yres
xwin=xres/2;ywin=yres-100

f$=mpat$+"01.png"

LOADSPRITE f$,1
GETSPRITESIZE 1,sx,sy
CREATESCREEN 1,2,sx,sy
USESCREEN 1;DRAWSPRITE 1,0,0;USESCREEN -1
yt=(yres/2)+105

REPEAT;UNTIL MOUSEAXIS(3)=0
REPEAT
DRAWRECT 0,0,xres,yres,RGB(30,30,30)
DRAWRECT xwin-1,0,2,ywin,RGB(100,100,100)
DRAWRECT xwin,(yres/2)+100,xwin,2,RGB(100,100,100)
PRINT "Curs-Mueve Imagen |"+x+" "+y,xwin,yt,1
PRINT "Raton Izq y Der: recorta viñeta",xwin,yt+25,1

MOUSESTATE mouse.x,mouse.y,mouse.b1,mouse.b2

IF mouse.b1=1 AND mouse.x<xwin
x1=mouse.x+x;y1=mouse.y+y
ENDIF
IF mouse.b2=1 AND mouse.x<xwin
x2=mouse.x+x;y2=mouse.y+y
ENDIF

IF x2<=x1 THEN x2=x1+1
IF y2<=y1 THEN y2=y1+1

tu=KEY(42)+KEY(54)

GETSPRITESIZE 1,sx,sy
IF KEY(203)=1 THEN DEC x,1+(tu*16)
IF KEY(205)=1 THEN INC x,1+(tu*16)
IF KEY(200)=1 THEN INC y,1+(tu*16)
IF KEY(208)=1 THEN DEC y,1+(tu*16)
IF x<0 THEN x=0
IF x>(sx-xwin) THEN x=sx-xwin
IF y<0 THEN y=0
IF y>(sy-yres) THEN y=sy-yres

VIEWPORT 0,0,xwin-1,yres
DRAWSPRITE 1,-x,-y

DRAWLINE x1-x,y1-y,x2-x,y1-y,RGB(255,255,0)
DRAWLINE x2-x,y1-y,x2-x,y2-y,RGB(255,255,0)
DRAWLINE x2-x,y2-y,x1-x,y2-y,RGB(255,255,0)
DRAWLINE x1-x,y2-y,x1-x,y1-y,RGB(255,255,0)

PRINT x1+" "+x2+" "+y1+" "+y2,0,0
USESCREEN 1
GRABSPRITE 3,x1-x,y1-y,(x2-x1)-x,(y2-y1)-y
// GRABSPRITE 3,0,0,100,100
USESCREEN -1
VIEWPORT xwin+1,5,xwin-2,(yres/2)+96
GETSPRITESIZE 3,sx,sy
z1=(xwin-2)/sx;z2=((yres/2)+96)/sy
z=MIN(z1,z2)
IF z>1 THEN z=1
IF z<>1
ZOOMSPRITE 3,(-sx*(1-z))/2,(-sy*(1-z))/2,z,z
ELSE
DRAWSPRITE 3,0,0
ENDIF
USESCREEN -1
SHOWSCREEN
UNTIL k$="q"

ENDFUNCTION