Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 20.08.2013, 14:45 Titel: GFX-Buffer als String |
|
|
Hallo zusammen,
hat jemand eine Idee, wie man einen FBGFX Image Buffer in einen String konvertieren kann?
Ideal wäre es natürlich, wenn man diesen String auch wieder in einen Image-Buffer zurück konvertieren könnte..
Vielen Dank schon mal! |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 20.08.2013, 15:14 Titel: |
|
|
Hmm.. ich dachte eher daran einen String Pointer auf den Anfang eines Buffers zeigen zu lassen.. allerdings kenne ich mich nicht mit dem Aufbau der verschienen String-Datentypen aus.
Also es geht mir jetzt nicht darum, einen buffer in "lesbare" Zeichen zu übersetzen.. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 20.08.2013, 16:17 Titel: |
|
|
Ein String besteht nicht nur aus dem Pointer zu seinem Inhalt. Du müsstest dir also zuerst einen Speicherbereich für den String-Header reservieren und korrekt beschreiben. Inwieweit das "sicher" ist und nicht mit FB-internen Stringverwaltungsdingen in Konflikt kommt, kann ich dir aber nicht sagen. Pointer-mäßig problemlos ginge es mit einem ZSTRING, der aber ausscheidet, weil im Speicher sicher auch Nullbytes vorkommen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 20.08.2013, 18:09 Titel: |
|
|
Code: |
#include once "fbgfx.bi" 'grafik includieren
open cons for output as #1 'terminal output umlenkung öffnen
screenres 300, 300, 32 'grafik öffnen
Dim Img as any Ptr 'var für das img
Img = imagecreate(10, 20, 0, 32) 'img erzeugen
Dim ImgPtr as Any Ptr 'DataPointer
Dim ImgW as UInteger 'Width
Dim ImgH as UInteger 'Height
Dim ImgB as UInteger 'BPP
Dim ImgP as UInteger 'Pitch
ImageInfo(Img, ImgW, ImgH, ImgB, ImgP, ImgPtr) 'Bilddaten einholen
Dim TStr as String Ptr 'Temp String erzeugen
TStr = CAllocate(SizeOf(UInteger) * 3)
Cast(Any Ptr, Cast(UInteger Ptr, TStr)[0]) = ImgPtr 'Bildspeicher als Stringspeicher setzen
Cast(UInteger Ptr, TStr)[1] = ImgH * ImgP * ImgB 'Bildgröße als datenlänge grösse setzen
Cast(UInteger Ptr, TStr)[2] = ImgH * ImgP * ImgB 'Bildgröße als alloc setzen
Print #1, Len(*TStr) 'Stringdaten auf terminal ausgeben
Print #1, *TStr 'Stringdaten auf terminal ausgeben
Sleep 1000, 1
ImageDestroy(Img) 'Bild wieder zerstören
'Ab jetzt darf nicht mehr auf das TStr zugegriffen werden, da duch ImageDestroy auch der Speicher für TStr zerstört wurde.
DeAllocate(TStr)
'Ab jetzt darf auf TStr überhaupt nicht merh zugegriffen werden, da dessen Speicher nicht mehr existiert
screen 0 'grafik schliessen
end 0 'sauberer exit
|
ist allerdings ne sehr heiße sache, und sollte wirklich nur im äußerstem Notfall angewendet werden.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 20.08.2013, 18:37 Titel: |
|
|
Ich habe es zwar noch nicht eingesetzt, aber wenn du img nicht als ANY PTR, sondern als FB.Image PTR definierst, solltest du auf Breite, Höhe usw. direkt zugreifen können.
http://www.freebasic-portal.de/befehlsreferenz/interne-pixelformate-464.html _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Zuletzt bearbeitet von nemored am 20.08.2013, 18:40, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 20.08.2013, 18:39 Titel: |
|
|
Das ist richtig. Allerdings sollte man darauf verzichten und lieber die imageinfo funktion nutzen, da sich das format und der interne Aufbau ändern könnte. (früher hab ich das direkt gemacht, allerdings gabs dann in der tat irgend wann mal ne umstellung, und dann gings nimmer. Seither nutz ich die (auch etwas langsamere) funktion, sicherheitshalber.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 20.08.2013, 18:45 Titel: |
|
|
Der interne Aufbau interessiert mich ja nur, wenn ich meinen Header selbst schreibe (ich verstehe im Moment gar nicht, warum das im von mir verlinkten Artikel so gemacht wird, anstatt gleich img->height zu nutzen ...); sichergestellt muss nur sein, dass das UDT FB.Image weiterhin die Daten unter diesem Namen bereithält. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 20.08.2013, 18:48 Titel: |
|
|
ach, so meinst du das. KK
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 20.08.2013, 18:56 Titel: |
|
|
Warum sollte man binäre Daten in einen String umwandeln ?
Mir fällt da nur eine sinnvole Anwendung ein. In Textdateien speichern bzw. als Text versenden. Und genau da sollte man eine Base64 Codierung verwenden, sodass nicht ausversehen Zeichen umkodiert werden.
Der andere Punkt ist dass bei einem Nullbyte die Gefahr besteht dass so ein String plotzlich abgeschnitten werden könnte und so die Daten korumpiert werden. Diese Frage könnten allerdings einige Cracks klären.
Zuletzt bearbeitet von RockTheSchock am 20.08.2013, 18:58, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 20.08.2013, 18:58 Titel: |
|
|
@RockTheSchock .. auch bei base64 kann dies passieren, und da ists sogar noch schlimmer, weil das automatisch den rest der darauffolgenden daten gleich mit zerstört.
Wenn es Übertragugnssicher werden soll, muss man ECC oder ähnliche Korrekturverfahren anwenden.
Nullbytes sind bei FB-Strings kein problem. Nur bei ZStrings, und die nutzt man ja kaum noch (außer ein paar API Aufrufe).
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 20.08.2013, 19:01 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | Nullbytes sind bei FB-Strings kein problem. Nur bei ZStrings, und die nutzt man ja kaum noch (außer ein paar API Aufrufe).
| Ok wieder was dazu gelernt. Trotzdem gilt beim Versenden von Textdaten z.B. in Mails ist Vorsicht geboten. |
|
Nach oben |
|
 |
storky

Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 20.08.2013, 19:34 Titel: |
|
|
Hey,
also wenn ich irgendwas in einen String bekommen möchte, bilde ich meistens die Struktur eines Strings nach und setze einen String ptr drauf.
Also ca
Code: |
Type myStringT
stAdd As Any Ptr
stLen As UInteger
stMem As UInteger
End Type
Dim as myStringT myString
Dim as String Ptr myStringPtr
myString.stAdd = Anfang vom Buffer 'Screenptr
myString.stLen = Länge vom Buffer 'w * h * (bit/8)
myString.stMem = Länge vom Buffer 'w * h * (bit/8)
myStringPtr = @myString
|
Dannach enthält man mit *myStringPtr Zugirff auf den neuen "String". |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 21.08.2013, 08:59 Titel: |
|
|
@storky: Perfekt! Danke! Ich glaub genau das ist das was ich gesucht habe!!!
Und auch ein großes Dankeschon an alle anderen  |
|
Nach oben |
|
 |
|