![]() |
Re: Icon pixelfrei
1. Das Windows-Bitmap Format was u.A. Delphi verwendet ist Äusserst bescheiden wenn es um die
Verwendung von Transparenzen geht. 2. Warum bleibst du nicht einfach bei Icons, zum Zeichnen dieser aber nur DrawIconEx() der Windows-API nutzen sonst wirds es wieder nix richtiges. 3. Willst du doch Bitmaps dan nutze die GR32 - Bitmaps die den Alphakanak unterstützen 4. Was du willst gnau machen mit die Icons ? |
Re: Icon pixelfrei
Kommt drauf an was man vor hat. Wenn man das Icon selber zeichnen kann, dann ist sicherlich DrawIconEx die beste Wahl. Allerdings wenn das ein Icon in einer Komponente sein soll, dann kommt man um Bitmaps teilweise nicht herum, da diese leider nur mit Bitmaps arbeiten. So war es zu mindest bei mir immer.
Ich hatte gerade noch mal in Quellen von mir geschaut. Dort mache ich komischer weise nichts anderes als das Icon auf ein weißes Bitmap zu zeichnen. Und dabei wurde die Transparenz automatisch mit reingerechnet. Das was du im ersten Code gemacht hattest. Nur eben direkt weißer Hintergrund und Pixelformat war pf24Bit. Allerdings dort hatte es funktioniert. Was ich etwas komisch finde. Bei dem zweiten Code müsstest du den Alphakanal direkt mit verrechnen. Denn Windows Bitmap können eigentlich kein Alphakanal. Verrechnen kannst du das in dem du für jedes Pixel die resultierende Farbe berechnest. Der Wert aus der Maske spiegelt dann die Sichtbarkeit wieder. Entweder die Hintergrundfarbe oder die des Pixels aus dem Icon. Natürlich musst du jeden Kanal seperat berechnen. |
Re: Icon pixelfrei
Hm, DrawIconEx dürfte wohl richtig sein.
Mit folgendem Code wird allerdings kein Icon mehr gezeichnet, seht ihr den Grund ?
Delphi-Quellcode:
function GetIcon(filename : String; IconIndex: Integer) : TBitmap;
begin Result := TBitmap.Create; DrawIconEx(Result.Handle, 0, 0, ExtractIcon(hInstance, PChar(Filename), IconIndex), 0, 0, 0, 0, DI_NORMAL); end; |
Re: Icon pixelfrei
:wiejetzt:
Ja. Zitat:
Code:
Sicher ist dein Code aber nicht und ob das so hinnhaut ?!
DrawIconEx([color=#ff0000]Result.Canvas.Handle[/color], 0, 0, ..., 0, 0, 0, DI_NORMAL);
|
Re: Icon pixelfrei
Habe dabei wohl gepennt. Ändert aber nichts an der Ausgabe. Meinst du mit unsicher, dass ich nicht prüfe, ob die Funktion fehlschlägt ?
|
Re: Icon pixelfrei
Hmmm. So kann das nicht gehen. Denn dein Bitmap hat gar keine Größe. Außerdem so wird das Icon gar nicht wieder freigegeben, da du das Handle ein Mal an eine Funktion übergibst und sofort vergisst.
Du solltest also wohl das Handle des Icons einem TIcon zuweisen. Mit der Größe dieses das Bitmap initialisieren. Und dann mit DrawIconEx das Icon auf das Bitmap zeichnen. PS: Bitmap als Rückgabewert halte ich persönlich auch für nicht unproblematisch. Da eine andere Stelle das Bitmap freigeben muss als die bei der es erzeugt wurde. Also ich würde es erzeigen und per const an die Methode übergeben. |
Re: Icon pixelfrei
Ich habe es gerade zusammengebaut, es wird nun wieder gezeichnet aber genauso pixelig wie vorher:
Delphi-Quellcode:
procedure GetIcon(filename : String; IconIndex: Integer; var Result : TBitmap);
var Ico : TIcon; begin Ico := TIcon.Create; Ico.Handle := ExtractIcon(hInstance, PChar(Filename), IconIndex); Result := TBitmap.Create; with Result do begin Width := Ico.Width; Height := Ico.Height; DrawIconEx(Canvas.Handle, 0, 0, Ico.Handle, 0, 0, 0, 0, DI_NORMAL); end; Ico.Free; end; |
Re: Icon pixelfrei
Benutzt du rein zufällig etwas anderes als Windows XP? Also zum Beispiel Windows 2000. Denn Windows 2000 kann noch keine Transparenzen.
Evtl schau dir auch mal an was du für Bitmaps bekommst. Also die mit GetIconInfo. Einfach mal auf Platte schreiben oder in Images darstellen. Vielleicht sind die Bilder ja schon falsch. Denn sonst sieht der Code für mich zu mindest nicht falsch aus. |
Re: Icon pixelfrei
Wenn ich das richtig verstanden habe, gibts Probleme mit dem Alpha Channel.
Probier mal das hier: ![]() Klappt super. MfG MuTzE |
Re: Icon pixelfrei
Hi,
das Ergebnis sieht gut aus, aber ich verstehe nicht, was ich mit dem Ergebnis Icon.Images.Image anfangen soll. Das ist nämlich TIconImage und lässt sich nicht via Canvas zeichnen. Habe mich nochmal genauer damit beschäftigt:
Delphi-Quellcode:
Nun gibt es eine AV in der markierten Zeile der AdvancedIcon.pas:
procedure GetIcon(filename : String; IconIndex: Integer; var Result : TBitmap);
var NumberOfIcons : Integer; Ico : TIcon; Icon : TAdvancedIcon; IconLib : TIconLibrary; Image : TIconImage; begin NumberOfIcons := ExtractIcon(hInstance, PChar(Filename), UINT(-1)); Ico := TIcon.Create; if (Ico <> nil) and (NumberOfIcons > -1) then Ico.Handle := ExtractIcon(hInstance, PChar(Filename), IconIndex); Icon := TAdvancedIcon(Ico); IconLib := TIconLibrary.Create; Image := Icon.Images.Image[1]; Result := TBitmap.Create; Image.Draw(Result.Canvas, 0, 0); Ico.Free; Icon.Free; IconLib.Free; end;
Delphi-Quellcode:
Ich gehe davon aus, dass oben TAdvancedIcon(Ico) falsch ist, was müsste anstelle davon hin ? So habe ich es zumindest im Beispielcode gesehen.
function TIconImageList.GetIconImage(Index : Word) : TIconImage;
begin Result:=nil; IF Index>FCapacity Then exit; <-- Result:=FList^[Index]; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 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-2025 by Thomas Breitkreuz