Ich böchte ein Bild in einer Textdatei sichern und anschließend aus
dem Text wieder ein Bild erhalten.

Dazu kann man Base64 Kodierung benutzen. Weiß ich.
Ich habe mich für eine Abwandlung davon entschieden, weil das für
meine Anwendung einen Vorteil hat. Generell ist das Verfahren wohl
identisch, nutzt aber IMHO andere ASCII-Bereiche.
(. und /, 0-9,  A-Z und a-z) Hmmm... wenn ich mir das so ansehe, bin ich
mir nicht mehr sicher.

Vom Prinzip her werden 3 Byte in 4 Gruppen zu 6 Bit aufgeteilt und
diesen 6 Bit ASCII-Zeichen zugeordnet.

Meine Routine macht genau das, was sie soll. Leider indiskutabel langsam
:-(

Für ein 150x150 Pixel großes Bild benötige ich auf meinen G4/733
gut 30 Sekunden zum einpacken und gut doppelt solange zum auspacken.

Ich sehe in meiner Routine auch nicht, was ich da beschleunigen
könnte. Ich würde maximal 1-2 Sekunden zum entpacken der Daten
akzeptieren. Hat jemand einen Tip (Source weiter unten)?

Ich habe mir auch schon das Plugin von Christian angesehen. Das wäre
schnell genug :-)
Allerdings habe ich nicht herausgefunden, wie ich aus dem String ein
Picture-Objekt bekomme. Das Beispiel, das beiliegt benutzt immer JPEG.
Ich hätte aber lieber ein Picture-Object.

Alles in allem wäre mir eine Beschleunigung meiner Routine lieber, da
ich die auch noch an anderer Stelle nutzen kann (und günstiger wäre
es auch).

MfG, Metti.

Source:

 dim Zielblock as MemoryBlock
 dim i,z,bis,vier,drei,byte1,byte2,byte3,byte4 as integer
 dim b as BinaryStream
 dim r,s,t,u,Urtext as String
 dim ti as Integer
 ti=Ticks


 urtext=ReplaceAll(text,Chr(13),"")
 urtext=ReplaceAll(Urtext,Chr(10),"")
 if len(urtext)>3 Then
   Zielblock=new MemoryBlock((len(urtext)/4)*3)
   bis=len(urtext)

   for i=1 to bis Step 4
     byte4=asc(mid(urtext,i,1))
     if byte4>96 then
       byte4=byte4-59
     elseif byte4>64 then
       byte4=byte4-53
     elseif byte4>45 then
       byte4=byte4-46
     end
     byte3=asc(mid(urtext,i+1,1))
     if byte3>96 then
       byte3=byte3-59
     elseif byte3>64 then
       byte3=byte3-53
     elseif byte3>45 then
       byte3=byte3-46
     end
     byte2=asc(mid(urtext,i+2,1))
     if byte2>96 then
       byte2=byte2-59
     elseif byte2>64 then
       byte2=byte2-53
     elseif byte2>45 then
       byte2=byte2-46
     end
     byte1=asc(mid(urtext,i+3,1))
     if byte1>96 then
       byte1=byte1-59
     elseif byte1>64 then
       byte1=byte1-53
     elseif byte1>45 then
       byte1=byte1-46
     end

     byte1=Bitwise.ShiftLeft(byte1,6)
     byte1=byte1+byte2
     byte1=Bitwise.ShiftLeft(byte1,6)
     byte1=byte1+byte3
     byte1=Bitwise.ShiftLeft(byte1,6)
     byte1=byte1+byte4

     byte3=BitwiseAnd(byte1,&hFF)
     byte1=Bitwise.ShiftRight(byte1,8)
     byte2=BitwiseAnd(byte1,&hFF)
     byte1=Bitwise.ShiftRight(byte1,8)
     Zielblock.Byte(z)=byte1
     z=z+1
     Zielblock.Byte(z)=byte2
     z=z+1
     Zielblock.Byte(z)=byte3
     z=z+1
   next

   MsgBox "TicksSTB="+Str(ticks-ti)
   Return
PictureErzeugen(Zielblock,val(StaticText1.Text),val(StaticText2.Text))
 else
   MsgBox"Text zu kurz"
 end

Antwort per Email an