Kuvien käsittely muistipaloilla?

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
User avatar
elmo123
Active Member
Posts: 153
Joined: Sun Sep 09, 2007 4:19 pm

Kuvien käsittely muistipaloilla?

Post by elmo123 » Sat Feb 11, 2012 1:38 pm

Päätin kokeilla, ovatko CB:ssä ladatut kuvat jotenkin luettavissa muistipalojen avulla. Muutamien testiarvojen jälkeen huomasin, että jos käytetään kuvamuuttujaa muistipalan kahvana ja vähennetään siitä 24:

HUOM! koodin ajaminen saattaa kaataa ohjelman, mahdollisesti koko koneen! Älä siis suorita seuraavaa koodia, jos koneen kaatumisia on esiintynyt käsitellessäsi muistipaloja väärin!

Code: Select all

img = LoadImage("Media\tatti.bmp")

'img = MakeImage(16, 16)

'DrawToImage img

'    Color 255, 0, 0
'    Box 0, 0, 16, 16

'DrawToScreen

fLog = OpenToWrite("imagelog.txt")

w = ImageWidth(img)
h = ImageHeight(img)

Print "Reading MEMBlock from: " + img
WriteLine fLog, "Reading MEMBlock from: " + img


For i = 0 To w*h*4-1

    Print "  Byte ID " + i + "; data: " + PeekInt(img-24, i*4)
    WriteLine fLog, "  Byte ID " + i + "; data: " + Bin(PeekInt(img-24, i*4))

Next i




CloseFile fLog

WaitKey

//KUVAN PIIRTOA; täyttä sekamelskaa, ehkä uusi satunnaislukugeneraattori?
'Lock

'For i = 0 To w*h

'    PutPixel2 i Mod (w+1), RoundDown(i / h), PeekInt(img-24, i*4)

'Next i

'Unlock

'DrawScreen

'WaitKey

Tuloksena ei tule Memory Access Violationia, toisin kuin millään muilla arvoilla kokeiltaessa, vaan tulostuu arvoja, myös nollasta poikkeavia. Siispä tuossa osoitteessa saattaa olla luettavaa dataa, jota voitaisiin muokata muistipaloilla huomattavasti nopeammin kuin perineisillä piirtokomennoilla! Mutta toistaiseksi seuraavia omituisia ongelmia on tullut vastaan:
  • Ladatuilla kuvilla muuttujan vähentäminen 24:llä toimii, kun lennossa luoduilla kuvilla taas ei.
  • Arvot eivät tunnu vastaavan lainkaan ladatun kuvan väriarvoja. Arvot muuttuvat aivan toisiksi joka ikisellä kerralla, vaikka kokeilin yksivärisillä kuvilla.
  • Satunnaisilla ajokerroilla ohjelma MAVittaa kesken datan luennan.
  • IMAGE()-funktio käytäytyy omituisesti. Jos siitä otetaan arvo ja tulostetaan se, seuraavalla lukukerralla ohjelma MAVittaa!
OS on Windows 7 64-bit, joten muilla järjestelmillä voi tulla jotain ihan hevon****aa. Onko CB:n kuvamuisti jotenkin vääristelty, ettei siihen pääsisi käsiksi?
Kiinnostuin pelien tekemisestä ennen 1. luokkaa.
Sitten 3. luokalla tuli CB. Ja siitä se alkoi.

Blender! TF2! CB! Game Maker! Nokia-mollaus! Kitaransoitto! Breakdance! MadTracker! Minecraft!

User avatar
Latexi95
Guru
Posts: 1165
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Kuvien käsittely muistipaloilla?

Post by Latexi95 » Sat Feb 11, 2012 3:08 pm

Itse olen kokeillut joskus samaa, mutta dll:ien avulla. Pääsin kyllä johonkin dataan käsiksi, kun ohjelma ei lukenut yli, mutta ei siitä datasta ottanut selvää.

User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 12:17 pm
Location: Espoo

Re: Kuvien käsittely muistipaloilla?

Post by MetalRain » Sun Feb 12, 2012 11:24 pm

Kokeilinpa lukea hieman tuon kuvan osoittaman osoitteen lähistöltä ja haistella mahdollisia uusia osoittimia toisiin paikkoihin. Näin sain ainakin tietooni kuvan koon. Huomasin myös että ohjelman tekemät kuvat (makeimage) ja lataamat kuvat toimivat hieman eri tavoin.

Tässä pieni testikoodi, jossa ensin luetaan kuvan osoittamasta muistipaikasta kuvan osoittimen kohdalta jonka jälkeen seurataan tätä osoitinta toiseen paikkaan ja luetaan sieltä hieman lisää.

Koitin katsoa josko näistä löytyisi mitään järjellistä dataa ja toisaalta jotain merkkejä siitä mistä kohtaa nämä muistipalat voisivat loppua. Koitin myös helpottaa muistin sisällön visualisointia lukemalla muistia tavu kerrallaan sekä kokonaisluvuittain neljän tavun välein ja vielä myös muuntaen luetut tavut ascii merkeiksi.

Code: Select all

img = LoadImage("media/cow.bmp")

If (FileExists ("imagedata.txt")) Then DeleteFile "imagedata.txt"

Dim bVal(4) As Byte 
//Dim recPntr(100) As Integer
//Global recursionPointers


readMemory(img,img,4,"image")

toImage = PeekInt(img,0)

//these two are the only thing that is certain for sure
getWidth = PeekInt(img,toImage-img+20)
getHeight = PeekInt(img,toImage-img+24)

fLog = OpenToEdit("imagedata.txt")
SeekFile fLog,FileSize("imagedata.txt")
WriteLine fLog, "Found image @ "+toImage+" having "+getWidth+"x"+getHeight+" pixels"
WriteLine fLog, ""
CloseFile fLog

readMemory(img,toImage,88,"image")

toSomePoint = PeekInt(img,toImage-img+64)

readMemory(img,toSomePoint,60,"something")

toPalette = PeekInt(img,toImage-img+68)

readMemory(img,toPalette,128,"maybe palette?")


Execute "notepad imagedata.txt"


Function readMemory(mem,from,amount,name$)//,recursive=0)

    fLog = OpenToEdit("imagedata.txt")
    
        SeekFile fLog,FileSize("imagedata.txt")
        
        //recursions = 0
        
        WriteLine fLog, "Mem dump "+amount+" bytes @ "+(from)+" named: "+name$
        
        For i = from To from+amount-4 Step 4
        
            txt$ = PadString(i,12)+PadString(i-from,4)+":"
        
            For o=0 To 3
                bVal(o)=PeekByte(mem,(i-mem)+o)
                txt$ = txt$+PadString(bVal(o),4)
            Next o
            
            iVal = PeekInt(mem,i-mem)
            
            txt$ = txt$+" Int:"+PadString(iVal,12)
            
            txt$ = txt$+" String: "
            
            For o=0 To 3
                txt$ = txt$+PadString(Chr(bVal(o)),1)
            Next o
            
            
            If ( Abs(iVal-(from)) < 20000 And iVal>(from) ) Then 
                txt$ = txt$+" Pointer?"
                remstart
                If (recursive <> 0 And recursionPointers < 100) Then 
                    recPntr(recursionPointers) = iVal
                    recursionPointers = recursionPointers + 1
                    recursions = recursions +1
                    txt$ = txt$+" followed in "+recursions
                EndIf
                remend 
            EndIf 
            

            WriteLine fLog, txt$
        
        Next i
        
        WriteLine fLog, ""
        
    CloseFile fLog
    
    remstart 
    If (recursive <> 0 And recursions>0) Then 
        For i=1 To recursions
            readMemory(mem,recPntr(i),4,name$+"->"+i,False)
        Next i
    EndIf 
    remend 

End Function 

Function PadString(txt$,amount)
    l = Max(amount-Len(txt$),0)
    While (l>0)
        txt$ = " "+txt$ 
        l=l-1
    Wend
    Return txt$ 
End Function 
elmo123 wrote:IMAGE()-funktio käytäytyy omituisesti. Jos siitä otetaan arvo ja tulostetaan se, seuraavalla lukukerralla ohjelma MAVittaa!
Huomasin että ongelma oli nimenomaan tulostuksessa, arvoja voi nätisti kyllä tallentaa tiedostoon. Voi olla siis että vaikka arvoja löytäisi ja saisi luettua ja ehkä jopa muutettua niin silti tämän jälkeen ei voisi kuitenkaan tulostaa ruutua ilman että MAV läjähtää ruudulle.

Post Reply