Yes seems like this problem is cause by your image being no square of the power of 2. I tried to create a little demo how to work around this:
GLOBAL SpriteQuadG AS TQuadMesh
TYPE TQuadMesh
id% = -1
p2wX# = 64.0
p2wY# = 64.0
FUNCTION Init%: PixelsInWorldUnitX#, PixelsInWorldUnitY#
X_AUTONORMALS 0
self.id = GENX_OBJ()
X_OBJSTART self.id
X_OBJADDVERTEX 0, -1, 0, 0,1, RGB(255,255,255)
X_OBJADDVERTEX 0, 0, 0, 0,0, RGB(255,255,255)
X_OBJADDVERTEX 1, -1, 0, 1,1, RGB(255,255,255)
X_OBJADDVERTEX 1, 0, 0, 1,0, RGB(255,255,255)
X_OBJEND
self.p2wX = PixelsInWorldUnitX#
self.p2wY = PixelsInWorldUnitY#
ENDFUNCTION
ENDTYPE
TYPE TQuadSprite
id% = -1
w#; h#
QuadInPixel%
pivotX#
pivotY#
FUNCTION Load%: path$
LOCAL sprite% = GENSPRITE()
LOADSPRITE path$, sprite
GETSPRITESIZE sprite, self.w, self.h
LOCAL u%, v%, t# = LOGN(self.w)/LOGN(2)
u = t
IF t<>u THEN INC u
t = LOGN(self.h)/LOGN(2)
v = t
IF t<>v THEN INC v
IF u<v THEN u=v
u=POW(2,u)
self.QuadInPixel = u
IF u=self.w AND u=self.h
self.id = sprite
ELSE
LOCAL screen% = GENSCREEN()
self.id = GENSPRITE()
CREATESCREEN screen, self.id, u,u
USESCREEN screen
STRETCHSPRITE sprite, 0,0, u,u
USESCREEN -1
CREATESCREEN screen, -1, 0,0
LOADSPRITE "", sprite
ENDIF
self.w = self.w / SpriteQuadG.p2wX
self.h = self.h / SpriteQuadG.p2wY
ENDFUNCTION
FUNCTION Pivot%: PivX%, PivY% // Input in Pixel on original sized image; (0,0) is top left
self.pivotX = -PivX / SpriteQuadG.p2wX
self.pivotY = PivY / SpriteQuadG.p2wY
ENDFUNCTION
FUNCTION Draw%: x#, y#, z#=0
X_SETTEXTURE self.id, -1
X_SCALING self.w, self.h, 1
X_MOVEMENT x+self.pivotX, y+self.pivotY, z
X_DRAWOBJ SpriteQuadG.id, 1
ENDFUNCTION
FUNCTION RotoDraw%: x#, y#, z#=0, phi#=0.0
X_SETTEXTURE self.id, -1
X_SCALING self.w, self.h, 1
X_MOVEMENT x, y, z
X_ROTATION phi,0,0,1
X_PUSHMATRIX
X_MOVEMENT self.pivotX/self.w, self.pivotY/self.h, 0
X_DRAWOBJ SpriteQuadG.id, 1
X_POPMATRIX
ENDFUNCTION
FUNCTION ZoomDraw%: x#, y#, z#=0, relx#=1.0, rely#=1.0
X_SETTEXTURE self.id, -1
X_SCALING self.w*relx, self.h*rely, 1
X_MOVEMENT x+self.pivotX*relx, y+self.pivotY*rely, z
X_DRAWOBJ SpriteQuadG.id, 1
ENDFUNCTION
FUNCTION RotoZoomDraw%: x#, y#, z#=0, phi#=0.0, relx#=1.0, rely#=1.0
X_SETTEXTURE self.id, -1
X_SCALING self.w*relx, self.h*rely, 1
X_MOVEMENT x, y, z
X_ROTATION phi,0,0,1
X_PUSHMATRIX
X_MOVEMENT self.pivotX/self.w, self.pivotY/self.h, 0
X_DRAWOBJ SpriteQuadG.id, 1
X_POPMATRIX
ENDFUNCTION
ENDTYPE
How to use it:
// 1st Initilize the system and tell it how many pixels you have in one world unit (x and y)
SpriteQuadG.Init(64,64)
// now you can create as many sprites as you want (of cause you could also use arrays of this type):
GLOBAL fighter1 AS TQuadSprite
GLOBAL fighter2 AS TQuadSprite
// now its time to load the images:
fighter1.Load("1/1.png")
fighter2.Load("2/1.png")
// feel free to change the sprites pivot:
fighter1.Pivot(50,0)
// like in 2D you can use/draw every sprite as often as you want:
fighter1.Draw(5,0)
fighter1.Draw(7,0)
fighter1.ZoomDraw(7,2,0, 0.5,0.5)
fighter2.RotoDraw(-2,0,0, 45)
fighter2.RotoZoomDraw(-5,2,0, 78, 2.0)
This internally stretches your sprite to the next square of the power of two - please be aware, that this can cause visible artefacts, try of SMOOTHSHADING on or off is better for your needs. This was the best that I could get out fast with pure GLBasic, if we would use INLINE and native OpenGL results would be better and faster. But still maybe that helps you, even though its not commented.