![]() |
PictureToString ?
Hallo,
Ich würde gerne ein Bild in einen string umwandeln, hat jemand eine Idee wie ich eine Funktion "PictureToString" realisieren kann ? gruss |
Re: PictureToString ?
naja wie sollte das endprodukt aussehen?
|
Re: PictureToString ?
Was meinst du genau, welche Zeichen alle verwendet werden dürfen ?
Alle. Das Bild möchte ich natürlich durch eine Gegen-Funktion "StringToPicture" wieder bekommen können. gruss |
Re: PictureToString ?
Benutze einen StringStream und schreibe das Bild als 'SaveToStream' dort rein. Dann kannst Du mit der Eigenschaft 'DataString' (?) den String auslesen.
Ich hatte das mal angedacht, um plattformübergreifend binäre Daten zu verschicken. Das geht zwar, aber Variants sind besser. Finde ich. |
Re: PictureToString ?
thx, werde ich gleich mal testen :thumb:
Variant würde eventuell auch gehen, müsste ich mal ausprobieren, wie bekomm ich denn ein Bild am einfachsten in ein Variant ? |
Re: PictureToString ?
|
Re: PictureToString ?
einfach jedem Pixel kopieren?
Delphi-Quellcode:
Umkehrfunktion kannst du dir ja denken (ichbins.schreibfaul:=true;)
function inttohexstr(i:integer):string;
begin Eben integerwert in einen hexstring verwandeln, genug Beispiele im Forum end; procedure bmptostr; var b:tbitmap; s:string; x,y:integer; begin ... (bmp erstellen) s:=inttohexstr(b.width)+inttohexstr(b.height); for x:=1 to b.with do for y:=1 to b.height do begin s:=s+inttohexstr(integer(b.pixels[x,y])); end; end; |
Re: PictureToString ?
@ichbins
meinst du nicht, daß sowas extrem langsam ist ... die vielen Stringoperationen? z.B. für pf8bit:
Delphi-Quellcode:
z.B. für pf24bit:
s := inttohex(b.width, 8) + inttohex(b.height, 8);
for y := 0 to b.height - 1 do s := s + toHexBE(b.ScanLine[y], b.width);
Delphi-Quellcode:
s := inttohex(b.width, 8) + inttohex(b.height, 8);
for y := 0 to b.height - 1 do s := s + toHexBE(b.ScanLine[y], 3 * b.width); //oder s := inttohex(b.width, 8) + inttohex(b.height, 8) + toHexBE(b.ScanLine[y], 3 * b.width * b.height);
Delphi-Quellcode:
Function toHexBE(Data: Pointer; Size: LongInt): String;
Const H: Array[0..15] of Char = '0123456789ABCDEF'; Var i: Integer; R: Char; Begin SetLength(Result, Size * 2); R := PChar(Result); While Size > 0 do Begin R^ := H[PByte(Data)^ shr 4]; Inc(R); R^ := H[PByte(Data)^ and $0F]; Inc(R); Inc(Integer(Data)); Dec(Size); End; End; //i hof ma ich hab's richtig übersetzt °_° |
Re: PictureToString ?
Delphi-Quellcode:
Procedure StringToBitmap (Const aValue: String; aBitmap : TBitmap);
Var s: TStringStream; Begin s := TStringStream.Create(aValue); Try aBitmap.LoadFromStream (S); Finally s.free End; End; Procedure BitmapToString (aBitmap : TBitmap; Var aString : String); Var S : TStringStream; Begin S := TStringStream.Create; Try aBitmap.SaveToStream (S); aString : =S.DataString; Finally M.Free; End; End; |
Re: PictureToString ?
Dazu sage ich nur: Wenn das erste Pixel vom Bild schwarz ist, kannst du den schönen string vergessen. zumindest wenn man mit API-funktionen arbeitet und das ganze dann z.B. in ein Memo haben will.
Ich gehe mal davon aus, dass es nur aus buchstaben und zahlen bestehen soll. Ich würde da dann mal auf ![]() Ansonsten kann man auch einen ByteArray benutzen, anstatt einen string als solchen zu missbrauchen... ;) |
Re: PictureToString ?
Zitat:
Desweiteren kenne ich keine API-Funktion, die ein Bitmap als String erwartet und kenne auch Keinen, der in einem Memo etwas mit einem String anfangen kann oder will, der nach o.g. Methode aus einer Bitmap erstellt wurde.
Delphi-Quellcode:
Ich seh' da immer 1000...
Var
s : String; i : Integer; begin s:=''; For i:=1 to 1000 do s:=s+#0; showmessage(IntToStr (Length(s))); end; Und eine Bitmap macht da keinen Unterschied. Als PChar würde ich sie natürlich nicht casten. |
Re: PictureToString ?
Zitat:
Zitat:
Wenn jemand ein Bild in einen string konvertieren will, stellt sich doch die Frage:
Delphi-Quellcode:
:gruebel: :firejump:
case of was_will_er_wirklich:
case ASCII-Art: erkläre(ASCII-Art); case Kodierung_zur_Übertragung: erkläre(Encodings); case else: erkläre(Wie_missbrauche_ich_einen_string_als_byte_array); |
Re: PictureToString ?
Yep, aber wenn er Bild in String will, kriegt er Bild in String. Er könnte es auch in ein Variant packen. Ehrlich gesagt misbraucht man einen String nicht, wenn man ihn mit Binärdaten füttert. Man macht sich nur das Leben schwer. Vor allen Dingen, wenn man den String nimmt, und zwischen verschiedensprachigen Zeichensätzen hin und her schiebt. Das ist dann wirklich lustig, weil irgendwo eine implizite Anpassung der Character passiert. Und DAS ist dann vielleicht ein Spass.
|
Re: PictureToString ?
Moin,
also lesbar muss der Srring nicht sein, und meine Idee hatte eigentlich auch nur folgenden Grund: Ich mhabe einige Daten in einer XML-Datei, und nun habe ich noch ein paar Bildchen, und hätte diese lieber in der Datei als in einem Ordner (damit einfach alle Daten in einer Datei sind). Da XML aber auch variant versteht, werde ich es wohl hiermit lösen, auf diese Idee bin ich selbst einfach nicht gekommen, und da war mit der String eben am nahelingensten. gruss |
Re: PictureToString ?
Hai MrKnogge,
nur als ergänzung möchte ich noch anmerken das Du denn String ja auch einfach ![]() |
Re: PictureToString ?
Welche Vorteil hätte das ?
(höre Base64 zu ersten mal) gruss |
Re: PictureToString ?
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz