Icon auslesen und transparent speichern

Antworten
OLLI_S
Beiträge: 63
Registriert: Di 17. Jan 2012, 20:55

Icon auslesen und transparent speichern

Beitrag von OLLI_S »

Hallo,

ich habe unter Windows eine kleine Anwendung geschrieben, die aus einer EXE-Datei ein Icon ausließt und dieses Icon dann als *.ico auf die Festplatte speichert.
Hier mein Quelltext:

Code: Alles auswählen

procedure TfrmMainForm.btnSaveClick(Sender: TObject);
 
var
  IconHandle: THandle;
  ExtractedIcon: Ticon;
  IconDatei: Array[0..255] of char;
  IconSaveFile: String;
 
begin
  // Create an Icon
  ExtractedIcon := Ticon.create;
 
  // Copy the name + path of the EXE to an Array of Char
  StrPcopy(IconDatei,edtFileName.Text);
 
  // Extract the icon and show it in the Image control
  IconHandle := ExtractIcon(hInstance, IconDatei, 0);
  ExtractedIcon.Handle := IconHandle;
  imgIcon.Picture.Icon := ExtractedIcon;
 
  // File Name of the Icon file current folder + File-name of the EXE (where the icon is extracted)
  IconSaveFile := ExtractFilePath(Paramstr(0));
  IconSaveFile := IconSaveFile + ExtractFileName(edtFileName.Text);
  IconSaveFile := StringReplace(IconSaveFile, '.exe', '.ico', [rfReplaceAll, rfIgnoreCase]);
  IconSaveFile := StringReplace(IconSaveFile, '.dll', '.ico', [rfReplaceAll, rfIgnoreCase]);
 
  ExtractedIcon.SaveToFile(IconSaveFile);
 
  ExtractedIcon.Free;
 
end;


Das ganze funktioniert zwar (die Icons werden ausgelesen und auch gespeichert), aber das Icon hat einen schwarzen Hintergrund.
Wie kann ich das Icon mit einem transparenten Hintergrund speichern?
In meinem Formular wird das Icon transparent angezeigt...

Danke für eure Hilfe!

Gruß

OLLI

Mathias
Beiträge: 4711
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Icon auslesen und transparent speichern

Beitrag von Mathias »

Code: Alles auswählen

IconDatei: Array[0..255] of char;
...
StrPcopy(IconDatei,edtFileName.Text);

Es ist zwar nicht dein Problem, aber das sieht sehr gefährlich aus. Was machst du wen der Pfad " Datei länger als 255 Zeichen ist ?
Da wird knallhart überschrieben und es gibt einen SIGSEV.

Nimm doch wenigsten StrPLCopy();
Oder noch besser eine Dynamische Array für IconDatai auf die richtige Länge setzen . :wink:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

OLLI_S
Beiträge: 63
Registriert: Di 17. Jan 2012, 20:55

Re: Icon auslesen und transparent speichern

Beitrag von OLLI_S »

Mathias hat geschrieben:Nimm doch wenigsten StrPLCopy();
Oder noch besser eine Dynamische Array für IconDatai auf die richtige Länge setzen . :wink:

Welche unit muss ich denn einbinden, damit ich StrPLCopy verwenden kann?

Mathias
Beiträge: 4711
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Icon auslesen und transparent speichern

Beitrag von Mathias »

Welche unit muss ich denn einbinden, damit ich StrPLCopy verwenden kann?
Müsste in der gleichen Unit sein, wie StrPCopy.

Oder noch besser, direkt einen PChar verwenden.

Code: Alles auswählen

var
  pc: PChar;
begin
  pc := PChar(Edit1.Text);
  IconHandle := ExtractIcon(hInstance, pc, 0);

oder direkt:

Code: Alles auswählen

IconHandle :=  ExtractIcon(HINSTANCE, PChar(Edit1.Text), 0);
Zuletzt geändert von Mathias am Fr 13. Jul 2018, 18:01, insgesamt 1-mal geändert.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

theo
Beiträge: 8294
Registriert: Mo 11. Sep 2006, 19:01

Re: Icon auslesen und transparent speichern

Beitrag von theo »


Mathias
Beiträge: 4711
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Icon auslesen und transparent speichern

Beitrag von Mathias »

Mir ist letzte Zeit vielfach aufgefallen, das es mit Lazarus und Alpha/Tranparent Probleme gibt.

Ist das Ganze schlecht in Lazarus implementiert, und liegt das Problem wo anders ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2335
Registriert: Di 19. Jun 2012, 12:54

Re: Icon auslesen und transparent speichern

Beitrag von Michl »

Mathias hat geschrieben:Mir ist letzte Zeit vielfach aufgefallen, das es mit Lazarus und Alpha/Tranparent Probleme gibt.
Hauptsächlich unter Windows, da dort z.B. ein natives Canvas nur 24Bit Tiefe hat.

Mathias hat geschrieben:Ist das Ganze schlecht in Lazarus implementiert, und liegt das Problem wo anders ?
Das Problem liegt woanders. Es liegt an Zeit. Jedes auftauchende Problem braucht Zeit, es zu verstehen, es zu debuggen, Tests zu erstellen, zu testen, Vor- und Nachteile abzuwiegen und die beste Lösung zu finden.

Wie du weißt, ist Lazarus ein OpenSource-Projekt, an dem die User gleichzeitig Developer sind bzw. sein können. Taucht jetzt ein Problem auf, hat man schon mal den Vorteil, daß man selber das Problem sieht und nicht erst erklärt bekommen muss. Daher sollte man versuchen dieses Problem einzugrenzen und im Bugtracker melden. Der Idealfall wäre, das Problem komplett zu verstehen und dann einen Patch hochzuladen. Da hilft nur zupacken.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten