Seite 1 von 3

Image Grösse im Speicher

Verfasst: 12.12.2004 01:46
von Andreas21
Hallo ich habe mal eine Frage zu den Images.

Ich will ein ersteltes Bild per Network versenden aber es dazu nicht voher speichern um es dann neu einzulessen und dann zu versenden.

Gibts irgent eine möglichkeit die grösse eines Images zu ermiteln. also die grösse in Bites? Die Startadresse hat man ja.

Verfasst: 12.12.2004 01:53
von Laurin
Wenn ich das richtig herausgelesen habe, liegt das Bild in irgendeinem Puffer, der durch AllocateMemory() erzeugt wurde.

Die Größe, die du bei AllocateMemory() angegeben hast, wird auch übertragen, also der gesamte Puffer, ob nun verwendet oder nicht.

Um die Größe eines Bildes herauszubekommen, rechnet man einfach:

Code: Alles auswählen

Größe = Breite * Höhe * Farbtiefe in Bytes

Farbtiefe:
32 Bits -> 4 Bytes
16 Bits -> 2 Bytes
8 Bits (256 Farben) -> 1 Byte
Angaben (vorallem die Formel) ohne Garantie.

Greetz Laurin

Verfasst: 12.12.2004 02:09
von Andreas21
Nicht ganz. Ich rede hier von den PureBasic - Image.

Also ich erstelle eine Grafik

image = CreateImage(0, 100, 100)

Und will jetzt dieses Bild per Netzwerk versenden.
In image müste ja die Start Position stehen.
Also ab wo das Bild im Ram liegt.

Verfasst: 12.12.2004 02:19
von Laurin
Laut PB-Hilfe steht in image der Identifer - was immer das auch ist. (ImageID?)

Es scheint keine Möglichkeit zu geben, wie man die sPeicheradresse herausbekommt.


Hm...

Greetz Laurin



Edit: Vielleicht hilft OffsetOf(). Ist aber nur eine Vermutung.

Verfasst: 12.12.2004 02:24
von Andreas21
das ist aber nur so wenn du das machst.

Wenn #PB_Any als '#Image' Parameter verwendet wird, dann wird der Identifier des neuen Image als 'Ergebnis' zurückgegeben. Das Bild-Format wird vom aktuellen Bildschirm-Format abgeleitet.

also:

image = CreateImage(#PB_Any, 100, 100)

Edit:

also ich bekomme scheinbar das Ram adresse wieder. Jedenfalls sied es so aus.

debug CreateImage(0, 100, 100)

Verfasst: 12.12.2004 02:38
von Laurin

Code: Alles auswählen

*image = CreateImage(#PB_Any, 8, 8)

Debug *image

For i = 0 To 64
  Debug PeekB(*image+i)
Next
Es wird ein leeres 8x8 Image erzeugt. Leer heißt schwarz (0,0,0). Dann lesen wir 65 Bytes raus und geben die aus.
Wenn du dir die Debugergebnisse anschaust, wirst du merken, dass nicht nur 0 rauskommt. Es kann also keine Speicheradresse sein.

Greetz Laurin

Verfasst: 12.12.2004 02:49
von Andreas21
Jo leider. :-(
Da komme ich wohl nicht ums speichern rum und dann die datei neu einlessen und dann senden :-(

Danke für deine Hilfe.

Aber kannst du mir sagen warum das bei mir einen Fehler ergibt?

Code: Alles auswählen

*image = CreateImage(0, 8, 8) 

Debug *image 

For i = 0 To 64 
  Debug PeekB(*image+i) 
Next

Verfasst: 12.12.2004 02:55
von Laurin
Merkwürdiger Fehler... :?

Selbst wenn man statt der 0 eine Konstante einsetzt, stürzt das Programm ab.


Bug?


Greetz Laurin


Edit: Ich weiß jetzt, was das mit dem Identifier auf sich hat:
PB-Hilfe hat geschrieben:II. Dynamische Nummerierung

Manchmal ist die indexierte Nummerierung nicht sehr praktisch, um dynamische Situationen zu handhaben, wo wir mit einer unbekannten Anzahl von Objekten umgehen müssen. PureBasic bietet eine einfache und komplementäre Möglichkeit, Objekte auf eine dynamische Art und Weise zu erstellen. Beide Methoden (indexiert und dynamisch) können gleichzeitig - ohne irgendeinen Konflikt - verwendet werden. Um ein dynamisches Objekt zu erstellen, müssen Sie die #PB_Any Konstante anstelle einer Index-Zahl angeben, und die dynamische Nummer wird als Ergebnis der entsprechenden Funktion zurückgegeben. Dann verwenden Sie einfach diese Nummer mit den anderen Objektfunktionen an der Stelle, wo Sie sonst eine indexierte Zahl verwenden würden. Diese Art und Weise des Objekt-Handlings kann sehr nützlich sein, wenn es in Verbindung mit einer verknüpften Liste verwendet wird, welche auch auch einen dynamischen Weg des Speicherns darstellt. Ein vollständiges Beispiel für dynamische Objekte und verknüpfte Listen finden Sie hier: MDI ImageViewer.pb.
Beispiel

DynamicImage1 = CreateImage(#PB_Any, 640, 480) ; Erstellen eines dynamisch nummerierten Bildes
ResizeImage(DynamicImage1, 320, 240) ; Verändern der Größe von DynamicImage1

Verfasst: 12.12.2004 02:59
von Deeem2031
Wieso bug?
CreateImage() gibt euch entweder die PBID oder das handle zum bitmap zurück, keines der beiden hat was mit der Speicheradresse des Bildes zu tun...

Verfasst: 12.12.2004 03:02
von Laurin
Ach ja, jetzt sehe ich es auch...

Pff, manchmal sehe ich den Wald vor lauter Bäumen nicht.

Greetz Laurin