Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Farbwerte aus Image herausholen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 31.07.2009, 08:38    Titel: Farbwerte aus Image herausholen Antworten mit Zitat

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 31.07.2009, 14:14    Titel: Antworten mit Zitat

Wer weiß hier eine Lösung, um die Farbwerte zu ermitteln???

Das Programm ist lauffähig.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 31.07.2009, 14:36    Titel: Antworten mit Zitat

Code:
If Point (x,y) = Rgb(0,255,0) Then...


x,y sind dann die Koordinaten eines Punktes in deinem Quadrat.

Hab leider keine Zeit näher auf deinen Code einzugehen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 31.07.2009, 18:36    Titel: Antworten mit Zitat

Ich suche etwas für eine ASM-abfrage.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz