Icon auslesen und transparent speichern

Icon auslesen und transparent speichern

Beitragvon OLLI_S » 10. Jul 2018, 22:05 Icon auslesen und transparent speichern

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
OLLI_S
 
Beiträge: 63
Registriert: 17. Jan 2012, 20:55

Beitragvon Mathias » 11. Jul 2018, 07:52 Re: Icon auslesen und transparent speichern

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
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon OLLI_S » 12. Jul 2018, 20:23 Re: Icon auslesen und transparent speichern

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?
OLLI_S
 
Beiträge: 63
Registriert: 17. Jan 2012, 20:55

Beitragvon Mathias » 12. Jul 2018, 21:35 Re: Icon auslesen und transparent speichern

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 13. Jul 2018, 17:01, insgesamt 1-mal geändert.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon theo » 13. Jul 2018, 10:21 Re: Icon auslesen und transparent speichern

theo
 
Beiträge: 8063
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 13. Jul 2018, 17:05 Re: Icon auslesen und transparent speichern

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
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 13. Jul 2018, 21:56 Re: Icon auslesen und transparent speichern

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; 
Michl
 
Beiträge: 2260
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

• Themenende •

Zurück zu Windows



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried