2-dimensionale Bank

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

TheProgrammer

Betreff: 2-dimensionale Bank

BeitragFr, Sep 17, 2004 8:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi.

Ich wollte mal fragen, ob man eine 2-dimensinale Bank
erstellen kann. Ich möchte damit Images speichern.

Wenn es keine 2-dimensionalen Banks (oder wie der Plural
auch immer lautet Rolling Eyes ) gibt, gibt es vieleicht eine andere Möglichkeit,
Images in einer Bank zu speichern?

Ich hoffe, die Frage hat nicht schonmal jemand gestellt...


PS: Wie kann man ermitteln, wie viele Byte man für ein bestimmtes Image brauch?
aktuelles Projekt: The last day of human being
 

Dreamora

BeitragFr, Sep 17, 2004 8:11
Antworten mit Zitat
Benutzer-Profile anzeigen
2D Banks gibt es nicht.

Aber man kann sie auch einfach umrechnen

Bank mit der Grösse MaxX* MaxY*Bytes

danach einfach die Daten an der Position y * MaxX + x auslesen bzw. einschreiben.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

TheProgrammer

BeitragFr, Sep 17, 2004 8:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke.

Und wie kann ich die Größe (Bytes) ausrechnen?
aktuelles Projekt: The last day of human being
 

Dreamora

BeitragFr, Sep 17, 2004 8:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Float: 4 Bytes
Int: 4 Bytes
String: Anzahl Zeichen Bytes

Und 32bit farben = 4 byte pro pixel
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

David

BeitragFr, Sep 17, 2004 8:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Quasi:
Code: [AUSKLAPPEN]

PicSize = ( PicWidth * PicHeight * ( Bpp shr 3  ) );


grüße
http://bl4ckd0g.funpic.de
 

Dreamora

BeitragFr, Sep 17, 2004 8:34
Antworten mit Zitat
Benutzer-Profile anzeigen
jo oder einfach BPP / 8 da 8 bit = 1 byte Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

TheProgrammer

BeitragFr, Sep 17, 2004 9:43
Antworten mit Zitat
Benutzer-Profile anzeigen
so. Ich hab das jetzt so gemacht:

Code: [AUSKLAPPEN]

Function LoadMultiImage(img$)

   image = LoadImage(img$)
   If image = 0 Then RuntimeError("Image existiert nicht!")
   If ImageWidth(image) > 65535 Or ImageHeight(image) > 65535 Then RuntimeError("Image ist zu groß!")

   bank = CreateBank((ImageWidth(image)*2+ImageHeight(image)*2)+(ImageWidth(image)*ImageHeight(image))*3)
   
   pos = 0
   SetBuffer ImageBuffer(image)
   LockBuffer ImageBuffer(image)
   For Y = 0 To ImageHeight(image)
    For X = 0 To ImageWidth(image)
     pixel = ReadPixelFast(X,Y)
   
     r=(pixel And $FF0000)/$10000
     g=(pixel And $FF00)/$100
     b=pixel And $FF

   
     PokeShort bank,pos,X
     pos = pos + 2
     PokeShort bank,pos,Y
     pos = pos + 2
     PokeByte bank,pos,r
     pos = pos + 1
     PokeByte bank,pos,g
     pos = pos + 1
     PokeByte bank,pos,b
     pos = pos + 1
    Next
   Next
   UnlockBuffer ImageBuffer(image)
   SetBuffer BackBuffer()
   
   FreeImage image
   Return bank

End Function


Doch dann kommt der Fehler "Offset out of range".
aktuelles Projekt: The last day of human being
 

David

BeitragFr, Sep 17, 2004 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Code: [AUSKLAPPEN]

CreateBank((ImageWidth(image)*2+ImageHeight(image)*2)+(ImageWidth(image)*ImageHeight(image))*3)


Ist das nicht ein wenig zu viel des Guten??
Width * Height * 3 reicht, bei einem 24!! bit Image, bei 32 Bit brauchst du 4 Byte pro Pixel, da der Alphakanal noch hinzukommt!

Desweiteren würde ich kein Image laden sondern direkt aus der Datei lesen, immer "n" Bytes und diese dann in dein Bank schieben.

Edit: Bzw. mit der image Variante kannst du diverse Kompressions- und Headerdaten-Fehler umgehen, ist also evtl doch nich so übel, da du dir ja massig Arbeit sparst!

grüße
http://bl4ckd0g.funpic.de
  • Zuletzt bearbeitet von David am Fr, Sep 17, 2004 10:10, insgesamt einmal bearbeitet

TheProgrammer

BeitragFr, Sep 17, 2004 10:10
Antworten mit Zitat
Benutzer-Profile anzeigen
äh...ja....

Könnt ihr vieleicht mal n' Beispiel zeigen,
wo in einer Funktion ein image in einer Bank
gespeichert wird?
aktuelles Projekt: The last day of human being
 

David

BeitragFr, Sep 17, 2004 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Der Ansatz war ja schon ganz gut!
Allerdings brauchst die die Koordinaten nicht mitzuspeichern, du kannst die Pixel aus deinem 1D Array ja recht leicht in den Pixelraster zurückrechnen!

Deine momentane Lösung funktioniert übrigens nicht mit 32 Bit Bildern, da der Alphakanal verloren geht. Vielleicht wäre eine, nicht ganz so einfache Lösung angesagt!

Den Überlauf bekommst du, weil du die Koordinaten als Short (2 byte) speicherst, also vorher zu wenig Platz im Bank reservierst.

grüße

P.S.: Sorry das ich nicht mit einem Beispiel dienen kann, da ich hier unter Linux arbeite.
http://bl4ckd0g.funpic.de

Vertex

BeitragFr, Sep 17, 2004 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
www.mitglied.lycos.de/theverte.../Banks.doc
Hier sind 2 dimensionale Arrays/Banks beschrieben.
mfg olli
vertex.dreamfall.at | GitHub
 

David

BeitragFr, Sep 17, 2004 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Mal ganz anders gefragt, was bezweckst du mit dem Haufen Bytes in einem Bank??

grüße
http://bl4ckd0g.funpic.de

TheShadow

Moderator

BeitragSa, Sep 18, 2004 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
in der hilfe unter createbank steht was zu 2d-banks und auch formeln etc...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group