AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
Thema durchsuchen
Ansicht
Themen-Optionen

Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)

Ein Thema von Zacherl · begonnen am 28. Sep 2012 · letzter Beitrag vom 22. Nov 2016
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)

  Alt 28. Sep 2012, 13:19
Hallo zusammen,

die hier vorgestellte Unit beinhaltet eine Klasse zum Laden und Speichern von Icons. Die Icons können sowohl aus einer Icon Datei, als auch aus einer Resource (beliebige PE Datei) geladen werden. Die Klasse stellt dann sämtliche Einzelbilder des geladenen Icons in einer Liste zur Verfügung. Bei Bedarf können auch die entsprechenden GDI Handles zum Zeichnen des Icons (per DrawIcon) erstellt werden (CreateIconHandles auf true setzen).

Das Hinzufügen, Entfernen oder Bearbeiten von Bildern wird nicht unterstüzt. Allerdings kann die Klasse beispielsweise dazu verwendet werden, um einer beliebigen PE Datei ein Icon hinzuzufügen, oder das bestehende Icon zu ersetzen.

Viele Grüße
Zacherl
Angehängte Dateien
Dateityp: pas dxIconUtils.pas (17,2 KB, 94x aufgerufen)
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 5. Okt 2012 um 02:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)

  Alt 28. Sep 2012, 14:06
Hi Zacherl, das funktioniert schön:
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var
 ir:TdxIconResource;
 ic:TIcon;
 i:Integer;
begin
   ic := TIcon.Create;
   ir:=TdxIconResource.Create;
   ir.CreateIconHandles := true;
   ir.LoadFromFile('C:\Icons\IconCollection\ix_ap_all\ico-files\add.ico');
   Caption := IntToStr(ir.ImageCount);
   For i := 0 to ir.ImageCount - 1 do
       begin
       memo1.Lines.Add(Format('H: %d W:%d NB:%d HD:',[ir.Images[i].Width,ir.Images[i].Height,ir.Images[i].Numbytes,ir.Images[i].Handle])) ;
       ic.Handle := ir.Images[i].Handle;
       canvas.Draw(i*50,i*20,ic);
       end;
   ic.Free;
   ir.Free;
end;
wie soll das mit den PE - Dateien gehen,oder verstehe ich etwas anderes als Du darunter?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)

  Alt 28. Sep 2012, 15:26
Hallo Bummi,

analog zum Laden aus einer Icon Datei, kannst du folgendes machen, um z.b. das Icon deiner eigenen EXE zu laden:
ir.LoadFromResource(hInstance, 'MAINICON'); Wenn du Icons aus externen PE Dateien extrahieren willst, kannst du wie folgt vorgehen:
Delphi-Quellcode:
var
  hModule: THandle;
begin
  hModule := LoadLibraryEx('ExterneExeDatei.exe', 0, LOAD_LIBRARY_AS_DATAFILE);
  if (hModule <> 0) and (hModule <> INVALID_HANDLE_VALUE) then
  try
    ir.LoadResource(hModule, 'ICONRESOURCENAME');
  finally
    FreeLibrary(hModule);
  end;
end;
Beim Speichern eines Icons in eine PE Datei funktioniert es etwas anders. Dort muss zum einen der Icon Header als RT_GROUPICON Resource angelegt werden und die Einzelbilder dann jeweils als eigene RT_ICON Resource. Deshalb übernimmt die SaveToResource() Funktion in diesem Falle den Dateinamen der Zieldatei als Parameter.

ir.SaveToResource('ExterneExeDatei.exe', 'ICONRESOURCENAME'); Wenn deine Zieldatei mehrere Icons besitzt könnte meine Methode allerdings teilweise die Einzelbilder überschreiben. Dafür habe ich bisher noch keinen Check eingebaut
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)

  Alt 28. Sep 2012, 18:42
Da ich keine Möglichkeit fand unbenannte Icongroups zu laden habe ich den Code etwas erweitert. Ich habe die geänderte Datei als dxIconUtils_modi.pas beigelegt, da ich nicht sicher bin ob die Änderungen so wie sie vorgenommen wurden für Dich akzeptabel sind.

EDIT:

Rückgebaut siehe Folgepost
Angehängte Grafiken
Dateityp: png IcoRes.png (53,8 KB, 96x aufgerufen)
Angehängte Dateien
Dateityp: zip IconGroup_Res.zip (18,1 KB, 49x aufgerufen)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (28. Sep 2012 um 19:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)

  Alt 28. Sep 2012, 19:40
Hallo Bummi,

die Funktion zum Enumerieren der Resourcen passt sehr gut dazu Für Erweiterungen der Unit, bzw. allgemein meiner Codes bin ich immer offen und dankbar. Danke auch für deine Demo Anwendung! Um eine unbenannte bzw. ID Resource zu laden, wäre alternativ auch folgende Lösung mit meiner originalen LoadFromResource Funktion möglich gewesen:
ir.LoadFromResource('PEDatei.exe', PChar(12345)); Wobei 12345 hier für die ID der IconGroup Resource steht. Die Windows APIs zum Laden von Resourcen erwarten einen PChar Parameter und erkennen automatisch, ob man hier wirlich einen Namen oder nur eine ID übergeben hat. Aus diesem Grund habe ich den ResourceName Parameter der LoadFromResource Funktion ebenfalls als PChar deklariert und nicht, wie man es vermutlich normalerweise machen würde, als String
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)

  Alt 28. Sep 2012, 19:43
Danke ... ich bau das zurück, was ein didn't know
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)

  Alt 22. Nov 2016, 15:19
Der Thread ist zwar schon was älter, aber, denk ich, nach wie vor aktuell.

Ich hab mir Zacherl's Code vorgenommen um noch ein paar extra Features dazu zu bauen.

Schließlich ist aber trotzdem eine eigene Klasse dazu gekommen (siehe Anhang)


Wichtiger Hinweiß:

Da mein Delphi keinen nativen PNG-Support bietet, bin ich auf eine externe Lib ausgewichen.
http://pngdelphi.sourceforge.net


Bisher hab ich das ganze nur rudimentär getestet (oder anders gesagt: Der Compiler meckert nicht).

Wer also Lust hat......

Natürlich sind auch Verbesserungen/Featurewünsche gern gesehen.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)

  Alt 22. Nov 2016, 16:50
Kleiner Fix beim Laden aus der Resource.

Die Tests (laden und speichern) laufen bisher gut.
Angehängte Dateien
Dateityp: pas dxIconList.pas (22,5 KB, 27x aufgerufen)
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz