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 SUBEsimerkki
savepcx "jee.pcx"
Örrörö rumalta näyttää mutta toimii kai ;>
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.. ;)
eilen haukuit DATAa..
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 ;>
Toimiva tuo on, mutta tosi hiras. Koskahan joku tekee BMPn tallennus ohojelman.
Aihe on jo aika vanha, joten et voi enää vastata siihen.