Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PictureToString ? (https://www.delphipraxis.net/66584-picturetostring.html)

MrKnogge 31. Mär 2006 19:51


PictureToString ?
 
Hallo,

Ich würde gerne ein Bild in einen string umwandeln, hat jemand eine Idee wie ich eine
Funktion "PictureToString" realisieren kann ?

gruss

Nicodius 31. Mär 2006 19:53

Re: PictureToString ?
 
naja wie sollte das endprodukt aussehen?

MrKnogge 31. Mär 2006 19:56

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

alzaimar 31. Mär 2006 19:57

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.

MrKnogge 31. Mär 2006 20:01

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 ?

toms 31. Mär 2006 20:07

Re: PictureToString ?
 
Bei Google suchenPictureToString

ichbins 31. Mär 2006 20:10

Re: PictureToString ?
 
einfach jedem Pixel kopieren?

Delphi-Quellcode:
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;
Umkehrfunktion kannst du dir ja denken (ichbins.schreibfaul:=true;)

himitsu 31. Mär 2006 21:07

Re: PictureToString ?
 
@ichbins
meinst du nicht, daß sowas extrem langsam ist ... die vielen Stringoperationen?

z.B. für pf8bit:
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], b.width);
z.B. für pf24bit:
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 °_°

alzaimar 3. Apr 2006 07:42

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;

DGL-luke 3. Apr 2006 16:21

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 Bei Google suchenBASE-64 und ähnliches verweisen.

Ansonsten kann man auch einen ByteArray benutzen, anstatt einen string als solchen zu missbrauchen... ;)

alzaimar 3. Apr 2006 16:28

Re: PictureToString ?
 
Zitat:

Zitat von DGL-luke
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.

Und ich sage dazu nur: Der String dient nur als Container, man könnte genausogut ein Variant nehmen. Und selbst wenn alle Pixelchens schwarz sind macht das nicht, weil in Delphi-Strings Nullen (#0) bis zum Sankt Nimmerleinstag vorkommen können.

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:
Var
  s : String;
  i : Integer;

begin
  s:='';
  For i:=1 to 1000 do s:=s+#0;
  showmessage(IntToStr (Length(s)));
end;
Ich seh' da immer 1000...
Und eine Bitmap macht da keinen Unterschied. Als PChar würde ich sie natürlich nicht casten.

DGL-luke 3. Apr 2006 16:36

Re: PictureToString ?
 
Zitat:

Zitat von alzaimar
Und ich sage dazu nur: Der String dient nur als Container, man könnte genausogut ein Variant nehmen. Und selbst wenn alle Pixelchens schwarz sind macht das nicht, weil in Delphi-Strings Nullen (#0) bis zum Sankt Nimmerleinstag vorkommen können.

Zitat:

Zitat von DGL-luke
Ansonsten kann man auch einen ByteArray benutzen, anstatt einen string als solchen zu missbrauchen... ;)

:zwinker:

Wenn jemand ein Bild in einen string konvertieren will, stellt sich doch die Frage:

Delphi-Quellcode:
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);
:gruebel: :firejump:

alzaimar 3. Apr 2006 16:52

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.

MrKnogge 8. Apr 2006 14:45

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

Sharky 8. Apr 2006 15:04

Re: PictureToString ?
 
Hai MrKnogge,

nur als ergänzung möchte ich noch anmerken das Du denn String ja auch einfach Base64 encodieren.

MrKnogge 8. Apr 2006 15:06

Re: PictureToString ?
 
Welche Vorteil hätte das ?
(höre Base64 zu ersten mal)

gruss

Sharky 8. Apr 2006 15:08

Re: PictureToString ?
 
Zitat:

Zitat von MrKnogge
Welche Vorteil hätte das ?
(höre Base64 zu ersten mal)...

Lese am besten mal den Beitrag bei Wikipedia.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz