qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 31.07.2009, 08:38 Titel: Farbwerte aus Image herausholen |
|
|
Hallo Leute, hallo Volta ,brauche jetzt noch einmal Hilfe.
Habe auf dem Screen 3 Vierecke verteilt.
Ein kleines 4. Viereck kann man mit den Tasten QWES steuern.
Oben rechts ist ein Viereck welches zur Kontrolle anzeigt wenn das steuerbare kleine Viereck duch das grüne Viereck in der Mitte fährt.
Dieses Kontrollbild hole ich dauernd mit "Get" heraus.
Nun möchte ich dieses Kontrollviereck abfragen , ob dort die Farbe RGB(0,255,0) erscheint. Aber es wird nichts auf der Konsole ausgeprintet. Es findet irgendwie keine richtige Pixelkontrolle statt.
Danke.
mfg
Code: |
#INCLUDE "fbgfx.bi"
CONST AS DOUBLE pi = 3.1415926, pi_180 = pi / 180
DECLARE SUB rotozoom( BYREF dst AS FB.IMAGE PTR = 0, BYREF src AS CONST FB.IMAGE PTR, BYVAL positx AS INTEGER, BYVAL posity AS INTEGER, BYREF angle AS INTEGER, BYREF zoomx AS SINGLE, BYREF zoomy AS SINGLE, BYVAL transcol AS UINTEGER = &hffff00ff, BYVAL offsetx AS INTEGER = 0, BYREF offsety AS INTEGER = 0 )
DIM AS STRING filename
DIM AS INTEGER iw, ih, siw,sih,siwh,xspr,yspr,sw
DIM AS SINGLE x1,y1,dx,dy
DIM AS fb.image PTR image, spritegr
DIM AS INTEGER angle
DIM AS SINGLE zoomx = 1, zoomy = 1
DIM kontrolle AS ANY PTR, pixdata AS ANY PTR, pitch AS INTEGER
DIM AS UINTEGER PTR p
DIM AS INTEGER zz,xx,yy
OPEN CONS FOR OUTPUT AS #1
PRINT #1,"Hallo"
SCREEN 19,32,2
kontrolle=IMAGECREATE(101,101)
ImageInfo kontrolle,,,, pitch, pixdata
iw=64
ih=64
image = IMAGECREATE(iw, ih)
LINE image,(0, 0)-(63,63), RGB(0,255,0), BF
siw=iw*1.5
sih=ih*1.5
siwh=siw/2
sw=2
spritegr=IMAGECREATE(siw,sih)
rotozoom( spritegr, image, siwh,siwh, angle+90, zoomx, zoomy )
PUT(dx+100,dy+100), spritegr, PSET
SCREENSET 1,0
CLS
LINE (50, 50)-(150,150), RGB(200,0,0), BF
LINE (200, 200)-(300,300), RGB(0,200,0), BF
LINE (350, 350)-(450,450), RGB(0,0,200), BF
SCREENSET 0,0
DO
IF MULTIKEY( FB.SC_S ) THEN
x1=SIN(angle*pi_180)*sw
y1=COS(angle*pi_180)*sw
dx+=x1
dy+=y1
END IF
IF MULTIKEY( FB.SC_W ) THEN
x1=SIN(angle*pi_180)*sw
y1=COS(angle*pi_180)*sw
dx-=x1
dy-=y1
END IF
IF MULTIKEY(FB.SC_E) THEN
angle -=1
IF angle<0 THEN angle = 360
IMAGEDESTROY spritegr
spritegr=IMAGECREATE(siw,sih)
rotozoom( spritegr, image, siwh,siwh, angle+90, zoomx, zoomy )
END IF
IF MULTIKEY(FB.SC_Q) THEN
angle +=1
IF angle>360 THEN angle = 0
IMAGEDESTROY spritegr
spritegr=IMAGECREATE(siw,sih)
rotozoom( spritegr, image, siwh,siwh, angle+90, zoomx, zoomy )
END IF
SCREENLOCK
SCREENCOPY 1,0
PUT(dx+100,dy+100), spritegr, TRANS
GET (200,200)-(300,300),kontrolle
PUT (650,10),kontrolle,PSET
FOR yy = 0 TO 100
p = pixdata + yy * pitch
FOR xx = 0 TO 100
IF p[xx] = RGB(0,255,0) THEN
PRINT #1,"gefunden"
ENDIF
NEXT xx
NEXT yy
SCREENSYNC
SCREENUNLOCK
SLEEP 5
LOOP UNTIL MULTIKEY(FB.SC_ESCAPE)
SUB rotozoom( BYREF dst AS FB.IMAGE PTR = 0, BYREF src AS CONST FB.IMAGE PTR, BYVAL positx AS INTEGER, BYVAL posity AS INTEGER, BYREF angle AS INTEGER, BYREF zoomx AS SINGLE, BYREF zoomy AS SINGLE = 0, BYVAL transcol AS UINTEGER = &hffff00ff, BYVAL offsetx AS INTEGER = 0, BYREF offsety AS INTEGER = 0 )
STATIC AS INTEGER mx, my, col, nx, ny
STATIC AS SINGLE nxtc, nxts, nytc, nyts
STATIC AS SINGLE tcdzx, tcdzy, tsdzx, tsdzy
STATIC AS INTEGER sw2, sh2, dw, dh
STATIC AS SINGLE tc, ts, _mx, _my
STATIC AS UINTEGER PTR dstptr, srcptr, odstptr
STATIC AS INTEGER xput, yput, startx, endx, starty, endy
STATIC AS INTEGER x(3), y(3), xa, xb, ya, yb, lx, ly
STATIC AS UBYTE PTR srcbyteptr, dstbyteptr
STATIC AS INTEGER dstpitch, srcpitch, srcbpp, dstbpp, srcwidth, srcheight
IF zoomx = 0 THEN EXIT SUB
IF zoomy = 0 THEN zoomy = zoomx
IF src = 0 THEN EXIT SUB
IF dst = 0 THEN
dstptr = SCREENPTR
odstptr = dstptr
SCREENINFO dw,dh,,,dstpitch
ELSE
dstptr = CAST( UINTEGER PTR, dst + 1 )
odstptr = CAST( UINTEGER PTR, dst + 1 )
dw = dst->WIDTH
dh = dst->height
dstbpp = dst->bpp
dstpitch = dst->pitch
END IF
srcptr = CAST( UINTEGER PTR, src + 1 )
srcbyteptr = CAST( UBYTE PTR, srcptr )
dstbyteptr = CAST( UBYTE PTR, dstptr )
sw2 = src->WIDTH\2
sh2 = src->height\2
srcbpp = src->bpp
srcpitch = src->pitch
srcwidth = src->WIDTH
srcheight = src->height
tc = COS( angle * pi_180 )
ts = SIN( angle * pi_180 )
tcdzx = tc/zoomx
tcdzy = tc/zoomy
tsdzx = ts/zoomx
tsdzy = ts/zoomy
xa = sw2 * tc * zoomx + sh2 * ts * zoomx
ya = sh2 * tc * zoomy - sw2 * ts * zoomy
xb = sh2 * ts * zoomx - sw2 * tc * zoomx
yb = sw2 * ts * zoomy + sh2 * tc * zoomy
DIM AS INTEGER centerx = -(offsetx*(tc*zoomx) + offsety*(ts*zoomx)) + offsetx
DIM AS INTEGER centery = -(offsety*(tc*zoomy) - offsetx*(ts*zoomy)) + offsety
x(0) = sw2-xa
x(1) = sw2+xa
x(2) = sw2-xb
x(3) = sw2+xb
y(0) = sh2-ya
y(1) = sh2+ya
y(2) = sh2-yb
y(3) = sh2+yb
FOR i AS INTEGER = 0 TO 3
FOR j AS INTEGER = i TO 3
IF x(i)>=x(j) THEN
Swap x(i), x(j)
END IF
NEXT
NEXT
startx = x(0)
endx = x(3)
FOR i AS INTEGER = 0 TO 3
FOR j AS INTEGER = i TO 3
IF y(i)>=y(j) THEN
Swap y(i), y(j)
END IF
NEXT
NEXT
starty = y(0)
endy = y(3)
positx-=sw2
posity-=sh2
positx+=centerx
posity+=centery
IF posity+starty<0 THEN starty = -posity
IF positx+startx<0 THEN startx = -positx
IF posity+endy<0 THEN endy = -posity
IF positx+endx<0 THEN endx = -positx
IF positx+startx>(dw-1) THEN startx = (dw-1)-positx
IF posity+starty>(dh-1) THEN starty = (dh-1)-posity
IF positx+endx>(dw-1) THEN endx = (dw-1)-positx
IF posity+endy>(dh-1) THEN endy = (dh-1)-posity
IF startx = endx OR starty = endy THEN EXIT SUB
xput = (startx + positx) * 4
yput = starty + posity
ny = starty - sh2
nx = startx - sw2
nxtc = (nx * tcdzx)
nxts = (nx * tsdzx)
nytc = (ny * tcdzy)
nyts = (ny * tsdzy)
dstptr += dstpitch * yput \ 4
DIM AS INTEGER y_draw_len = (endy - starty) + 1
DIM AS INTEGER x_draw_len = (endx - startx) + 1
ASM
mov edx, dword PTR [y_draw_len]
test edx, edx ' 0?
jz y_end ' nothing TO DO here
fld dword PTR[tcdzy]
fld dword PTR[tsdzy]
fld dword PTR [tcdzx]
fld dword PTR [tsdzx]
y_inner:
fld dword PTR[nxtc] 'st(0) = nxtc, st(1) = tsdzx, st(2) = tcdzx, st(3) = tsdzy, st(4) = tcdzy
fsub dword PTR[nyts] 'nxtc-nyts
fiadd dword PTR[sw2] 'nxtc-nyts+sw2
fld dword PTR[nxts] 'st(0) = nxts, st(1) = tsdzx, st(2) = tcdzx, st(3) = tsdzy, st(4) = tcdzy
fadd dword PTR[nytc] 'nytc+nxts
fiadd dword PTR[sh2] 'nxts+nytc+sh2
'fpu stack returns TO: st(0) = tsdzx, st(1) = tcdzx, st(2) = tsdzy, st(3) = tcdzy
mov ebx, [xput]
ADD ebx, [dstptr]
mov ecx, dword PTR [x_draw_len]
test ecx, ecx ' 0?
jz x_end ' nothing TO DO here
x_inner:
fist dword PTR [my] ' my = _my
fld st(1) ' mx = _mx
fistp dword PTR [mx]
mov esi, dword PTR [mx] ' esi = mx
mov edi, dword PTR [my] ' edi = my
' bounds checking
test esi, esi 'mx<0?
js no_draw
'mov esi, 0
test edi, edi
'mov edi, 0
js no_draw 'my<0?
cmp esi, dword PTR [srcwidth] ' mx >= WIDTH?
jge no_draw
cmp edi, dword PTR [srcheight] ' my >= height?
jge no_draw
' calculate position in src buffer
mov eax, dword PTR [srcbyteptr] ' eax = srcbyteptr
imul edi, dword PTR [srcpitch] ' edi = my * srcpitch
ADD eax, edi
SHL esi, 2
' eax becomes src pixel COLOR
mov eax, dword PTR [eax+esi]
cmp eax, [transcol]
je no_draw
' DRAW pixel
mov dword PTR [ebx], eax
no_draw:
fld st(3)
faddp st(2), st(0) ' _mx += tcdzx
fadd st(0), st(2) ' _my += tsdzx
' increment the OUTPUT POINTER
ADD ebx, 4
' increment the x LOOP
dec ecx
jnz x_inner
x_end:
fstp dword PTR [_my]
fstp dword PTR [_mx]
'st(0) = tsdzx, st(1) = tcdzx, st(2) = tsdzy, st(3) = tcdzy
'nytc += tcdzy
fld dword PTR[nytc]
fadd st(0), st(4)
fstp dword PTR[nytc]
'st(0) = tsdzx, st(1) = tcdzx, st(2) = tsdzy, st(3) = tcdzy
'nyts+=tsdzy
fld dword PTR[nyts]
fadd st(0), st(3)
fstp dword PTR[nyts]
'dstptr += dst->pitch
mov eax, dword PTR [dstpitch]
ADD dword PTR [dstptr], eax
dec edx
jnz y_inner
y_end:
finit
END ASM
END SUB
|
|
|