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