Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PCX-tallenusta QB:llä

thefox [20.08.2002 19:06:31]

#

Koodi tallentaa ruudussa Screen13:ssa olevan kuvan PCX -tiedostoon. Hidas on, mutta QB:llä on vaikea paljon nopeampaa saada ;)
Ja pakko kai se on jälleen kerran todeta että koodi on huonoa.. optimisoinnilla tuskin saavutetaan kuitenkaan niin suurta nopeushyötyä että siihen kannattaa vaivautua.
Koodin toimivuudestakaan ei ole 100% varmuutta, mutta toivon että tästä on jotain hyötyä jollekin.
Tehty QBX:llä (eli 7.1 tj). QB4.5:lla ei testattu (voi tulla ongelmia rivityksen kanssa).
Mutta mitäs tässä muuta... Niin, muista määritellä funktio DECLARE SUB:illa että voit kutsua sitä ilman CALL:ia.

Funktio 'savepcx'

SUB savepcx (f AS STRING)
   DIM a AS INTEGER, b AS INTEGER, c AS LONG, d AS LONG, e AS STRING * 1
   DIM h AS STRING

   DEF SEG = &HA000
   b = FREEFILE

   h = CHR$(&HA) + CHR$(&H5) + CHR$(&H1) + CHR$(&H8) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H3F) + CHR$(&H1) + CHR$(&HC7) + CHR$(&H0) + CHR$(&H48) + CHR$(&H0) + CHR$(&H48) + CHR$(&H0) + CHR$(&H0) + CHR$(&H1) + CHR$(&H4) + CHR$(&H0)  _
+ CHR$(&H4) + CHR$(&HB) + CHR$(&H0)
   h = h + CHR$(&H6) + CHR$(&H10) + CHR$(&H0) + CHR$(&H8) + CHR$(&H14) + CHR$(&H0) + CHR$(&HB) + CHR$(&H1B) + CHR$(&H0) + CHR$(&HE) + CHR$(&H22) + CHR$(&H0) + CHR$(&H10) + CHR$(&H26) + CHR$(&H0) + CHR$(&H12) + CHR$(&H2B) + CHR$(&H0) + CHR$(&H15) +  _
CHR$(&H33) + CHR$(&H0)
   h = h + CHR$(&H17) + CHR$(&H38) + CHR$(&H0) + CHR$(&H18) + CHR$(&H37) + CHR$(&H0) + CHR$(&H19) + CHR$(&H3B) + CHR$(&HB) + CHR$(&H21) + CHR$(&H3F) + CHR$(&H0) + CHR$(&H1C) + CHR$(&H43) + CHR$(&H0) + CHR$(&H1E) + CHR$(&H48) + CHR$(&H3) + CHR$(&H20) _
 + CHR$(&H47) + CHR$(&H0)
   h = h + CHR$(&H1) + CHR$(&H40) + CHR$(&H1) + CHR$(&H1) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&HD) + CHR$(&HA) + CHR$(&HD) + CHR$(&HA) + CHR$(&H53) + CHR$(&H61) + CHR$(&H76) + CHR$(&H65) + CHR$( _
&H64) + CHR$(&H20) + CHR$(&H77)
   h = h + CHR$(&H69) + CHR$(&H74) + CHR$(&H68) + CHR$(&H20) + CHR$(&H73) + CHR$(&H61) + CHR$(&H76) + CHR$(&H65) + CHR$(&H70) + CHR$(&H63) + CHR$(&H78) + CHR$(&H20) + CHR$(&H62) + CHR$(&H79) + CHR$(&H20) + CHR$(&H66) + CHR$(&H61) + CHR$(&H77) + CHR$ _
(&H6B) + CHR$(&H7A) + CHR$(&H20)
   h = h + CHR$(&H32) + CHR$(&H30) + CHR$(&H30) + CHR$(&H32) + CHR$(&HD) + CHR$(&HA) + CHR$(&HD) + CHR$(&HA) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$( _
&H0)

   IF DIR$(f) <> "" THEN KILL f

   OPEN f FOR BINARY AS b
   PUT #1, , h         ' PCX-headeri (128 tavua)
   c = 0

   DO UNTIL c = 64000       ' loopataan 320x200 pikselille
      a = PEEK(c)
      d = 1

      DO
         IF c = 64000 THEN EXIT DO
         IF PEEK(c + 1) = a THEN
            d = d + 1: c = c + 1
         ELSE
            EXIT DO
         END IF
      LOOP

      IF d = 1 THEN
         IF a >= 192 THEN
            e = CHR$(1 + 192)
            PUT b, , e
            e = CHR$(a)
            PUT b, , e
         ELSE
            e = CHR$(a)
            PUT b, , e
         END IF
      ELSE
         IF d > (255 - 192) THEN
            c = c - d + (255 - 192)
            d = 255 - 192
         END IF
         e = CHR$(d + 192)
         PUT b, , e
         e = CHR$(a)
         PUT b, , e
      END IF

      c = c + 1
   LOOP
   DEF SEG

   e = CHR$(&HC)      ' magic-tavu
   PUT b, , e

   OUT &H3C7, 0       ' tallennetaan paletti
   FOR c = 1 TO 768
      a = INP(&H3C9) * 4
      e = CHR$(a)
      PUT b, , e
   NEXT c

   CLOSE b
END SUB

Esimerkki

savepcx "jee.pcx"

thefox [21.08.2002 21:59:43]

#

Örrörö rumalta näyttää mutta toimii kai ;>

Antti Laaksonen [22.08.2002 00:03:29]

#

Nyt olisi kyllä jo kannattanut käyttää DATA-lauseita, tilaa olisi säästynyt ainakin 70%...

Mutta loppu koodi näyttää varsin siistiltä ja eiköhän se toimikin.. ;)

Jaakko [22.08.2002 11:03:43]

#

eilen haukuit DATAa..

thefox [22.08.2002 14:03:24]

#

Joo, DATA:n käyttö tuli mieleen jo tuota koodatessa (juuri tällaisiin se olisi suht koht kätevä vaikka en siitä oikein pidäkään) mutta QB ei hyväksy DATA:a funktion sisällä, enkä halunnut tunkea sitä mainiin joten tein sittenkin tuolla huonommalla tavalla, eli CHR:llä.
QB on itseasiassa melko tyhmä kun se ei osaa edes optimisoida noita CHR:iä pois kun niitä käytetään arvolla, joka ei muutu ohjelman suorituksen aikana (constant siis).
Mutta jos joku haluaa tuon käyttämään DATA:a (näyttää ainakin 10x siistimmältä) niin se hoituu suhteellisen helposti ;>

Dude [28.09.2007 18:01:45]

#

Toimiva tuo on, mutta tosi hiras. Koskahan joku tekee BMPn tallennus ohojelman.

Vastaus

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

Tietoa sivustosta