Entwickler-Ecke

Internet / Netzwerk - Favicon zu Data Problem


menticore - Mi 07.11.07 20:19
Titel: Favicon zu Data Problem
Hallo,

Im Grunde eine etwas ungewöhnliche Frage. Ich benutze den Mozilla Firefox und oben rechts kann man eigene Suchmaschinen einfügen. Dazu erstellt man unter "\Programme\Mozilla Firefox\searchplugins\" eine neue XML datei. Wie man das macht steht unter Developer Mozilla [http://developer.mozilla.org/en/docs/Creating_OpenSearch_plugins_for_Firefox].

Zur Idee:
Nun hatte ich zuerst ein Script geschrieben, was solch eine Datei automatisch erstellt. Mein Problem: Wie binde ich ein Icon mit ein. Man kann unter der Seite URI Kitchen [http://software.hixie.ch/utilities/cgi/data/data] ein Favicon in Data umwandeln, aber ich schaffe es nicht die Daten auszulesen. Klickt man mit dem IE (Version 6, mehrere PCs schon getestet), dann kommt ein "Die Seite kann nicht angezeigt werden" Fehler. Über Firefox gehts. Aber diesen Umweg will ich nicht machen (bin auch am Ende meines Wissens)

Also versuche ich es jetzt über Delphi. Gibt es eine Möglichkeit, ein Favicon (wie das Google Icon [http://www.google.de/favicon.ico] (es muss ein link sein)) in ein XML Format alá "data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAA[......]" umzuwandeln? Gibt es dazu eine Funktion? Wenn, ja welche?

Das URI Kitchen hat auch den Quelltext dazu, aber das ist Perl und ich kann damit überhaupt nichts anfangen. (Source [http://software.hixie.ch/utilities/cgi/data/data.pl])

Wär super, wenn jemand was findet....

Gruß,
manticore


menticore - So 11.11.07 22:22

hat keiner eine idee?

schade...


Narses - Mo 12.11.07 00:09

Moin!

Schonmal nach Suche in: Delphi-Forum, Delphi-Library BASE64 gesucht? :nixweiss:

cu
Narses


menticore - Mo 12.11.07 18:14

hey.

danke für antwort. habe unter allem gesucht, aber bisher kaum was gefunden. das runterladen des Icons funktioniert ohne Probleme. das umwandeln ist das problem.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  DownLoadInternetFile('http://www.google.de/favicon.ico','test.ico');
  stream:=TStream.Create;
  ico:=TIcon.Create;
  ico.LoadFromFile('test.ico');
  ico.SaveToStream(stream);
  memo1.Lines.Add(IdEncoderMIME1.Encode(stream));


ich mache da was falsch, aber was? ich möchte das Icon codiert haben als Mime-Typ, base 64, sodass so etwas herauskommt wie:
http://www.delphi-forum.de/viewtopic.php?t=73862&highlight=base64+xml

ich verzweifle -.-


menticore - Di 13.11.07 20:00

Hi

nach langem Suchen bin ich endlich fündig geworden. Leider nicht hier.
auf DelphiPraxis [http://www.delphipraxis.net/topic1153_base64+mime+endecoding.html] gibt es eine Base64 Kodierungs Unit. Die runterladen und 2 Funktionen im Programm einfügen, die ich auf einer ähnlichen Seite gefunden habe:

Decodieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function Base64DecodeFile(ABase64Str: String; AFileName: String): Boolean;
var
  InSize, OutSize: Cardinal;
  PIn, POut: Pointer;
begin
  result:= False;
  // get size of source
  InSize := Length(ABase64Str);
  // calculate size for destination
  PIn := @ABase64Str[1];
  OutSize := CalcDecodedSize(PIn, InSize);
  // prepare string length to fit result data
  with TMemoryStream.Create() do
  try
    SetSize(OutSize);
    POut := Memory;
    // decode !
    if Base64Decode(PIn, InSize, POut) then
    begin
      SaveToFile(AFileName);
      result:= True;
    end;
  finally
    Free;
  end;
end;


Encodieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
function Base64EncodeFile(AFileName: Stringvar ABase64Str: String): Boolean;
var
  ms: TMemoryStream;
  InSize, OutSize: Cardinal;
  PIn, POut: Pointer;
begin
  result:= False;
  if FileExists(AFileName) then
  begin
    with TMemoryStream.Create() do
    try
      LoadFromFile(AFileName);
      // get size of source
      InSize := Size;
      Position:= 0;
      // calculate size for destination
      OutSize := CalcEncodedSize(InSize);
      SetLength(ABase64Str, OutSize);
      // encode !
      PIn := Memory;
      POut:= @ABase64Str[1];
      Base64Encode(PIn, InSize, POut);
      result:= True;
    finally
      Free;
    end;
  end;
end;


und damit lässt sich der Spaß anwenden und es funktioniert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
begin
  Base64EncodeFile('favicon.ico',s);
  memo1.Lines.Add(s);
end;