Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: pcx-kuvan lataus

Vilikki [20.09.2002 12:24:20]

#

Tuossa pcx-laturi, jonka uhosin joskus tekeväni. Parannettavaa on, mutta ainakin se toimii. Esimerkiksi nuo psetit kannattaa muuttaa pokeksi (en muista nyt tarkempaa ohjetta, siihen tuli jotain def seg ennen pokea...). Ja muutenkin pari kuvaa oli vielä vähän ongelmallisia, mutta 320x200 kuva pitäisi latautua normaalisti...

'******************************* PCX-laturi *******************************
'*                     tehnyt: Ville Kumpulainen                          *
'**************************************************************************

TYPE pcxheader
        manufacturer AS STRING * 1
        version AS STRING * 1
        encoding AS STRING * 1
        bpp AS STRING * 1
        x AS INTEGER
        y AS INTEGER
        width AS INTEGER
        height AS INTEGER
        bitshorizontal AS INTEGER
        bitsvertical AS INTEGER
        egapaletti AS STRING * 48
        reserved AS STRING * 1
        planes AS STRING * 1
        bitsperline AS INTEGER
        palettetype AS INTEGER
        padding AS STRING * 58
END TYPE

TYPE vari
        r AS STRING * 1
        g AS STRING * 1
        b AS STRING * 1
END TYPE

DECLARE FUNCTION tuopcxkuva$ (f$, alkux!, alkuy!, loppux!, loppuy!)
DECLARE FUNCTION tuopcxpaletti$ (tiedosto$, mista!, mihin!, valoisuus)

SCREEN 13

' tähän tietysti tiedosto, jonka haluat ladata...
tiedosto$ = "me.pcx"

d$ = tuopcxpaletti$(tiedosto$, 0, 255, 255)
IF d$ <> "OK" THEN PRINT d$
d$ = tuopcxkuva$(tiedosto$, 0, 0, 320, 200)
IF d$ <> "OK" THEN PRINT d$

SLEEP

FUNCTION tuopcxkuva$ (f$, alkux, alkuy, loppux, loppuy)

a = FREEFILE
OPEN f$ FOR BINARY AS a
DIM v AS STRING * 1
DIM pcx AS pcxheader
GET a, , pcx

SELECT CASE pcx.width MOD 4
        CASE 0
                lisa = 0
        CASE 1
                lisa = 3
        CASE 2
                lisa = 2
        CASE 3
                lisa = 1
END SELECT

IF pcx.width > 320 THEN
        tuopcxkuva$ = "Liian leveä kuva"
ELSEIF pcx.height > 200 THEN
        tuopcxkuva$ = "Liian korkea kuva"
ELSEIF ASC(pcx.bpp) <> 8 THEN
        tuopcxkuva$ = "Kuvan täytyy olla 256-värinen"
ELSE
        toistot = 1
        x = pcx.x
        y = pcx.y

        DO
                GET a, , v
                IF ASC(v) >= 192 THEN
                        toistot = ASC(v) - 192
                        GET a, , v
                END IF
                FOR i = 1 TO toistot
                        IF x >= alkux AND x <= loppux AND y >= alkuy AND y <= loppuy THEN
                                PSET (x, y), ASC(v)
                        END IF
                        laskuri = laskuri + 1
                        x = x + 1
                        IF x >= pcx.width + lisa THEN x = 0: y = y + 1
                NEXT i
                toistot = 1

                tuopcxkuva$ = "OK"
                IF x > pcx.width AND y >= pcx.height THEN EXIT DO
                IF laskuri >= 64000 THEN EXIT DO
        LOOP
END IF
CLOSE a
END FUNCTION

FUNCTION tuopcxpaletti$ (tiedosto$, mista, mihin, valoisuus)
IF valoisuus > 255 OR valoisuus < 0 THEN
        tuopcxpaletti$ = "Valoisuus annettu väärin!"
ELSE
        a = FREEFILE
        OPEN tiedosto$ FOR BINARY AS a
        tiedostonkoko = LOF(a)
        SEEK #1, tiedostonkoko - 767
        DIM c AS vari
        FOR i = 0 TO 255
                GET a, , c
                IF i >= mista AND i <= mihin THEN
                        OUT &H3C6, 255
                        OUT &H3C8, i
                        OUT &H3C9, ASC(c.r) / 255 * 63 / 255 * valoisuus
                        OUT &H3C9, ASC(c.g) / 255 * 63 / 255 * valoisuus
                        OUT &H3C9, ASC(c.b) / 255 * 63 / 255 * valoisuus
                END IF
        NEXT i
        tuopcxpaletti$ = "OK"
END IF
END FUNCTION

thefox [21.09.2002 19:50:55]

#

En suosittelisi STRING:ien käyttämistä paluuarvoina, mieluummin määrittele vaikka:
CONST OK = 1
Ja sitten palauta OK.. tietysti jos välttämättä haluat virheilmoitukset noin niin mikäs siinä..
POKEa voi käyttää niin, että ensin määrittelee QB:n käyttämään segmenttiä A000 (jossa sijaitsee näyttömuisti 320x200 -tilaan):
DEF SEG = &HA000
Sitten lasketaan offsetti y*ruudunleveys+x, ja luirastaan väri eli:
POKE y*320+x, vari
Vielä yksi asia josta voisi valittaa on ehkä liian suuri tabstoppi-arvo :)

Vilikki [21.09.2002 22:10:22]

#

Joo, tein tuon aika nopeasti. ( laskuri >= 64000 ) -ehto tuli tuohon sen takia, että jos se ei muuten lopetakaan kuvan lukemista ja toisekseen tein tuon pääasiassa 320x200 -kuvia varten, siitä 64000...
...poke ei ole tuossa tapauksessa paljon sen nopeampi, kun hitaus johtuu lähinnä siitä, kun kiintolevyltä luetaan samassa. Tavallisestihan se on huomattavasti nopeampi kuin pset...

snakari [23.09.2002 10:24:01]

#

hidas, mutta hyvä (voi ladata muita kun 320*200 kuvia)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta